我有一个APIView,它会点击外部API本身来聚合结果。我已将其定义为:
class SampleView(APIView):
api = query_api()
def get(self, request, id):
result = self.api.query(id)
return HttpResponse(status=200)
我有一个模拟的API来使这个可测试,而不需要在我的单元测试中将外部API作为依赖项。在运行单元测试之前,我想做SampleView.api = fake_api()
之类的事情。
如何替换这样的单个属性,以便用一个模拟的具体类替换单元测试?
答案 0 :(得分:1)
我真的没有找到在{class}属性中使用api
对象的任何显着优势。它不属于视图,
您可以在get请求中实现object
。通过这样做,嘲笑是直截了当的。
In [21]: class ExternalApi(object):
def __init__(self, **kwargs):
print("APIService")
....:
In [22]: class MockedExternalApi(object):
def __init__(self, **kwargs):
print("FakeApiService")
....:
In [23]: def query_api():
return ExternalApi()
....:
In [24]: class MyView(object):
def get(self, request):
api = ExternalApi(23)
return "Something"
....:
In [25]: @mock.patch('__main__.ExternalApi')
def test(mocked_api):
mocked_api.return_value = MockedExternalApi()
view = MyView()
assert view.get({}) == "Something"
....:
In [26]: test()
FakeApiService
此外,您可以在settings
内查找query_api
变量,并根据场景返回正确的对象。