0

I have an API which use ElasticSearch to get data. I have to write test cases for this. These tests will be run using Circle CI. When we run test cases on test cases on Circle CI, test failed as ElasticSearch is not installed on Circle CI.

Now we want to Mock ElasticSearch in order to successfully executing tests. The problem is that we have to write test cases for APIs and in our tests, we are calling API using unit test requests. But we want to mock ElasticSearch which being accessed in our API. We tried to run our test cases by directly calling our view but it does not work. Below is our code.

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

Directory Structure:

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

When we run this test case, our required function is not get mocked. Can any one guide us how we can Mock our function in our Rest API?

Hassan Ejaz
  • 183
  • 2
  • 16

0 Answers0