gpt4 book ai didi

python - 如何使用mock.patch覆盖Django View 进行测试?

转载 作者:行者123 更新时间:2023-12-01 07:41:44 25 4
gpt4 key购买 nike

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

这适用于 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)

关于python - 如何使用mock.patch覆盖Django View 进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56674268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com