mocking & django.unittest.mock
2020년 12월 03일
Mock?
- object 사이의 의존성이 강해 실제 객체를 만들어 사용하기 힘든 경우
- 실제 객체를 만들어 사용하기에 비용이 높은 경우
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() 메소드 호출이 문제가 되는 것이기 때문. 오히려 의도치 않은 구간에 주입이 될 수 있으므로 그렇다.