pythonunit-testingmockingmagicmock

Mock.patch returning MagicMock object causing AssertionError?


I have a function that I am trying to test in querySomething.py:

class QuerySomething:

    def retrieveIssues(self,token):
    responses = []
    if "customFields" in self._event:
        if not self.custom_fields:
            fields = []
        else:
            fields = self.custom_fields
    else:
        fields = []
    for issueTypeKey, issueTypeValue in self.issueTypes.items():
        print(issueTypeKey, ":", issueTypeValue)
        query = self.getQuery(issueTypeValue, self.status, fields)
        respons = httpClient.get_request(query, token)
        responses.append(respons)
    return responses

And the test file:

def mock_getQuery():
    return "QUERY"

def mock_response(state):
    if state=="unauth":
        with open("src/tests/mockdata/unauthorized_api_response.json","r") as response_file:
            unauth_error = response_file.read()
        return json.dumps(unauth_error)
    elif state=="auth":
        with open("src/tests/mockdata/success_api_response.json","r") as response_file:
            success_message = response_file.read()
        return json.dumps(success_message)
    return "No message"

class test_query(unittest.TestCase):
    @mock.patch("querySomething.QuerySomething.getQuery", side_effect=mock_getQuery)
    @mock.patch("httpClient.get_request", side_effect=mock_response)
    def test_retreiveIssues_unauth_response(self,mock_get,QuerySomething):
        self.assertEqual(QuerySomething.retrieveIssues("token"),mock_response("unauth"))

if __name__ == "__main__":
    unittest.main()

I am trying to mock the httpClient.get_request so that it gets the JSON file instead of reaching out to the API. We want to test an unauthorized response and a success response which explains the mock_response function. However, when I run the test, I get the following:

AssertionError: <MagicMock name='getQuery.retri[36 chars]712'> != '"{\\n    \\"errorMessages\\": [\\n      [131 chars]\n}"'

which is somewhat correct, but we need just the text, not the object. I read that I need to call the function, but when I try to call the function it throws a ModuleNotFound or NotAPackage error. What do I need to do to mock the httpClient.get_request and return the JSON string in the retrieveIssues function?


Solution

  • Updated, I was able to pull the JSON from the other file, and then was able to mock the return value as follows:

    QuerySomething.retrieveIssues.return_value=load_json("unauth")
    

    where load_json("unauth") pulls from the JSON response file.