[Django]テストコードで外部APIのモックを作成する

Djangoで開発をしているときに、テストコードを作成することがあると思いますが、外部のAPIなどを呼び出している時のテストコードの実装方法について、忘れないようにメモしておきます。

開発環境

  • Django:2.x
  • Python:3.x

モックの作成

テストコード実行時に、外部APIの呼び出しの代わりになるモックを作成します。

# mock.py
class MockApi:
    def api_mock(self):
        return True

ここではとりあえず、モック実行時に「True」を返す関数を作成しました。戻り値については、外部APIの種類に応じて変更していけば良いです。

一覧取得するAPIなら配列を返すようにするとか・・・

テストコードを実装する

実際にモックを利用したテストコードを実装していきます。

from django.test import TestCase
from unittest.mock import patch
from project.app.mock import MockApi

class SampleTests(TestCase):
    @patch('project.app.file.class.method', MockApi.api_mock)
    def test_sample(self):
        # ここには普通に外部APIを実行しているコードのテストを実装します

ここで重要なのは、「patch」デコレータです。このデコレータに、外部APIを実行している関数とそれを置き換えるモックの関数をパラメータとして設定することで、テストコード実行時に外部APIの代わりにモックを実行してくれるようになります。

最後に

最近は様々な外部システムと連携しないといけない開発が増えてきたので、テストコードを実装する際には外部APIをモックに置き換えてテストすることで品質の担保もやりやすいかと思います。また、外部APIからの例外系のテストもこのモックを使えb簡単にできるので、そこもメリットではないかと・・・。外部のシステム実行した時に、わざと例外発生させるとかできませんしね。