无法在Django中使用Python Mock模拟REST API函数

时间:2019-04-19 16:27:25

标签: python django elasticsearch mocking django-unittest

我有一个使用ElasticSearch来获取数据的API。我必须为此编写测试用例。这些测试将使用Circle CI运行。当我们在Circle CI的测试用例上运行测试用例时,测试失败,因为在Circle CI上未安装ElasticSearch。

现在,我们想模拟ElasticSearch以便成功执行测试。问题在于我们必须编写API的测试用例,而在我们的测试中,我们使用单元测试请求来调用API。但是我们想模拟在我们的API中访问的ElasticSearch。我们试图通过直接调用我们的视图来运行测试用例,但是它不起作用。下面是我们的代码。

test.py

class Test_api(TestCase):
    @mock.patch("src.chart.views.MyView.my_function_to_mock", MagicMock(return_value='return value'))
    def setUp(self):
        self.user = User.objects.create_user('foo', 'foo@bar.de', 'bar')
        self.request = APIRequestFactory()

    def test_my_api(self):
        view = MyView.as_view()
        request = self.request.get('/api/abc/')
        force_authenticate(request, user=self.user)
        response = view(request)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data, 'return value')

view.py

 class MyView(views.APIView):
     permission_classes = [permissions.IsAuthenticated, ]
     def my_function_to_mock(self):
        g_es = Elasticsearch(hosts='myhost', timeout='100')
        res = g_es.search(
            index='myindex',
            body=dumps({"query": {"match_all": {}}}))
     return res

目录结构:

-src
    |-chart
        |-tests
            |-test_case.py
        |-views.py

运行此测试用例时,不会嘲笑我们所需的功能。谁能指导我们如何在Rest API中模拟我们的功能?

0 个答案:

没有答案