I am really new to Python and unit tests and I'm trying to write unit tests for a handler right now.
A simplified version of the handler looks something like this:
some_handler.py
def handleEvent(event):
user = event....
action = event...
response = getIsAuthorized(user, action)
return convertToHttpResponse(response)
getIsAuthorized(user, action):
...
authorizer = SomeAuthorizer()
return authorizer.isAuthorized(user, action)
SomeAuthorizer is a simple class:
some_authorizer.py
class SomeAuthorizer(object):
__init__(self):
# some instantiation of stuff needed for the 3P client
...
# creation of some 3P auth client
self.client = Some3PClient(...)
is_authorized(user, action):
return self.client.is_authorized(user, action)
The code itself is working as expected, but my tests are giving me hell. I got it to work in some circumstances with:
@patch.object(SomeAuthorizer, 'is_authorized')
def test_authorization_request_not_authorized(self, mock_is_authorized):
mock_is_authorized.return_value = False
response = handle_request(test_event("test_user", "testing"))
assert response == status_code(200, False)
But then when another dev ran the tests on their box, it failed and it seemed like the reason was because they didn't have some environment stuff set up locally that the constructor of the Authorizer needed (the errors they got locally were issues creating an instance of SomeAuthorizer when the tests were running). But my understanding was that the constructor shouldn't even be getting called because it's being mocked? Is this not the case?
Any tips on how to get around this? I've been beating my head against the wall trying to understand how the mocks are working and what combination of patch / mock would work but it's not going far.