1

我有一个返回字典的方法,该字典包含电子邮件特定的机密信息,如地址、收件人、令牌等。

为了发送电子邮件,我需要访问一个 REST URL 并将数据与机密信息一起发送。

我需要模拟负责发送邮件的方法

  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

想知道如何为这门课写一个模拟

根据 mattyx17 解决方案,

我创造了这个,

   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()

但是 mock_settings.get_confidential_data.assert_call_once() 以及

self.assertTrue(mock_utility.called) 给出错误。

4

1 回答 1

0

您可以模拟您的设置对象及其相应的方法来返回您想要的任何内容。

from unittest.mock import MagicMock()    

mock_settings = MagicMock()
confidential_dict = {0: "confidential_details", 
                     1: "confidential_subject",
                     2: "confidential_name",
                     3: "confidential3",
                     4:  "confidential4"}
mock_settings.get_confidential_data = MagicMock(return_value=confidential_dict)

现在,当您将模拟设置作为函数的参数提供时,您可以检查该get_confidential_data方法是否被调用 ( mock_settings.get_confidential_data.assert_called_once()) 并检查您的其他方法/类是否使用正确的信息从confidential_dict

同样,您可以模拟您的 Utilities 类:

from unittest.mock import patch

@patch("<path-to-class>.Utilities)
def my_test_class(mock_utilities):
   mock_object = MagicMock()
   mock_utilities.return_value = mock_object

现在mock_objectUtilities该类的模拟实例,您现在可以模拟发送电子邮件消息

于 2020-07-15T17:45:10.487 回答