I have a method that returns a dictionary and that dictionary contains email specific confidential information like address,recipient, token etc.
For sending an email, I need to access a rest URL and send the data along with confidential information.
I need to mock that method which responsible for sending the mail
def _get_email_status(self, settings: Settings, data: dict):
# it's a dictionary
email_param = settings.get_confidential_data()
json_content = Task.build_email_content(
weekly_build_details, email_param.get(0),
"subject", email_param.get(1),
"name", email_param.get(2),
email_param.get(3)
# this method contains the rest URL and hit that url
status = Utilities().send_email(email_param.get(4),
json_content)
return status
Wondering how I can write a mock for this class
As per mattyx17 solution,
I have created this,
test_data = {
'test': 'test'
}
confidential_data = {0: "confidential_details",
1: "confidential_subject",
2: "confidential_name",
3: "confidential3",
4: "confidential4",
5: "confidential5",
6: "confidential6"}
mock_settings = MagicMock()
mock_settings.get_confidential_data = MagicMock(return_value=confidential_data)
mock_settings.keys.return_value.__iter__.return_value = confidential_data.keys()
mock_settings.__getitem__.side_effect = lambda key: confidential_data[0]
param = mock_settings.get_confidential_data
print(param)
json_content = Task.build_email_content(test_data, dict(mock_settings).get(0),
dict(mock_settings).get(1), dict(mock_settings).get(2),
dict(mock_settings).get(3), dict(mock_settings).get(4),
dict(mock_settings).get(5))
testUtility = Utilities()
testUtility.send_email(settings, dict(mock_settings).get(5), json_content)
self.assertTrue(mock_utility.called)
print(json_content)
mock_settings.get_confidential_data.assert_called_once()
But mock_settings.get_confidential_data.assert_called_once() as well as
self.assertTrue(mock_utility.called) are giving error.
You can just mock your settings object and its corresponding method to return whatever you want.
Now when you supply mock settings as an argument to your function you can check that the
get_confidential_data
method was called (mock_settings.get_confidential_data.assert_called_once()
) and check that your other methods/classes were called with the correct info fromconfidential_dict
Similarly you can mock your Utilities class:
Now
mock_object
is a mocked instance of theUtilities
class and you can now mock the send email message