如何在django-rest-framework中模拟APIView上的单元测试属性

时间:2015-03-21 14:32:01

标签: python django unit-testing django-rest-framework

我有一个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()之类的事情。

如何替换这样的单个属性,以便用一个模拟的具体类替换单元测试?

1 个答案:

答案 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变量,并根据场景返回正确的对象。