Unit Test, mock, django

mocking & django.unittest.mock

Mock?

Apply.

class Test(TestCase):
    @patch('module.ClassName2')
    @patch('module.ClassName1')
    def test(MockClass1, MockClass2):
        module.ClassName1()
        module.ClassName2()
        assert MockClass1 is module.ClassName1
        assert MockClass2 is module.ClassName2
        assert MockClass1.called
        assert MockClass2.called

mock은 테스트 자체에 다는 것보다 필요한 곳에만 with으로 block 선언하여 쓰는 게 좋을 수 있음.

def test_(self):
    mock_s3 = mock.Mock()
    mock_s3.head_object = self.get_head_object()

    self._create_class_dependent_on_s3(arg1, arg2, ...)

    with mock.patch("boto3.client") as mock_boto_client:
        mock_boto_client.return_value = mock_s3
        response = client_with_auth.create(url, data)

response = client_with_auth.create(url, data) 의 콜스택에서 boto3.client 의 head_object() 메소드 호출이 문제가 되는 것이기 때문. 오히려 의도치 않은 구간에 주입이 될 수 있으므로 그렇다.