自称フルスタックエンジニアのぶろぐ。

pythonやreactや、gcpやawsなどなどについて書いていこうかと思います。

django テストコード mock patch

テストコード ✕ mock ✕ patch

djangoでテストコード書くときに、APIにアクセスする処理をテストするために、mockでpatchした時のメモ。

    def _call_api(self, send_data):
        """
        api呼ぶだけの関数
        :param send_data:
        :return: response
        """
        return requests.post(self.endpoint, data=send_data)
from unittest import mock
from django.test import TestCase


class ApiBatchTest(TestCase):
    # アノテーションで、中身を変えたい関数を指定
    @mock.patch('path.to.Class._call_api')
    def test_api(self, mock_get):
        # mock_get(引数)で、変更したい関数のmockを受取、return_value(戻り値)を好きな状態に書き換える
        mock_get.return_value.status_code = 200
        mock_get.return_value['status'] = 200


        def json():
            """
            期待するresponseのjson()の結果っぽく作った。
            """
            return {
                'result': {
                    'A': 0.5,
                    'B': 0.5,
                    'C': 0.5
                },
                'attention': 'test',
                'status': 200
            };

        setattr(mock_get.return_value, 'json', json)

        # 上記によって、テスト実行される関数の中身のstatus_codeや、response.json()が上記の内容となる。