如何使用 mock.patch 覆盖 Django 视图进行测试



是否可以用模拟覆盖类中的函数行为?

这是针对python 3.6.8,django 2.2.2

views.py:


YEAR_PATTERN = r"(d{4})s*$"
LOCKED_FROM_EXTERNAL_API = False

class FetchFromExternalApi(APIView):
    @staticmethod
    def fetch_from_url(source):
        return urlopen('http://files.grouplens.org/datasets/movielens/%s.zip' % source, timeout=1)
    def post(self, request):
        global LOCKED_FROM_EXTERNAL_API, YEAR_PATTERN
        if LOCKED_FROM_EXTERNAL_API is False:
            LOCKED_FROM_EXTERNAL_API = True
            try:
                source = request.data['source']
            except KeyError:
                LOCKED_FROM_EXTERNAL_API = False
                return Response('no source data in body',
                                status=status.HTTP_400_BAD_REQUEST)
            if source in settings.AVAILABLE_SOURCES:
                try:
                    response = self.fetch_from_url(request.data['source'])
                except URLError:
                    LOCKED_FROM_EXTERNAL_API = False
                    return Response("External server respond time out",
                                    status=status.HTTP_504_GATEWAY_TIMEOUT)

我想编写将覆盖fetch_from_url方法行为的测试,并完全模拟它。

是的,您可以修补类属性和方法。

在您的情况下,您还需要返回一个虚假的 http 响应对象,其中包含来自修补对象的预期数据。

例:

class FakeResponse:
    """A class for creating fake http responses for the patched method"""
    def __init__(self, body, status):
        self.body = body
        self.status = status

class MyTest(TestCase):
    def test_something(self):
        with mock.patch('file_name.FetchFromExternalApi.fetch_from_url') as mock_fetch:
            # now the `mock_fetch` will act as a proxy object for the 
            # actual fetch_from_url method
            # set the return value on `mock_fetch` object as expected 
            # from the `fetch_from_url` method
            fake_response = FakeResponse(body="Some expected data body", status=200)
            mock_fetch.return_value = fake_response
            # now you can perform tests against the returned data
            self.assertTrue(whatever)

最新更新