@pytest.mark.parametrize("test_input,expected_output", data)
def test_send_email(test_input, expected_output):
emails = SendEmails(email_client=MagicMock())
emails.send_email = MagicMock()
emails.send_new_email(*test_input)
emails.send_email.assert_called_with(*expected_output)
我希望模拟在send_new_email方法中调用的datetime.datetime.now()。但我不确定该怎么做。
我尝试创建一个新的日期时间对象
datetime_object = datetime.datetime.strptime('Jun 1 2017 1:33PM',
'%b %d %Y %I:%M%p')
然后覆盖datetime.datetime.now
datetime.datetime.now = MagicMock(return_value=datetime_object)
然而,我收到错误
TypeError:无法设置内置/扩展类型的属性' datetime.datetime'
此问题被标记为Python的副本:尝试模拟datetime.date.today()但不能正常工作
Python: Trying to mock datetime.date.today() but not working
我已经尝试过这个解决方案,但我无法让它工作。由于项目要求,我无法安装冻结枪。
我在测试文件中创建了一个新类
class NewDate(datetime.date):
@classmethod
def today(cls):
return cls(2010, 1, 1)
datetime.date = NewDate
但我不知道如何让SendEmails类使用它。
答案 0 :(得分:2)
你可以替换整个班级:
_FAKE_TIME = 0
class _FakeDateTime(datetime.datetime):
@staticmethod
def now():
return _FAKE_TIME
然后使用它:
_FAKE_TIME = whatever
datetime.datetime = _FakeDateTime
这个类需要像比较运算符这样的一些改进来使FakeDateTime与日期时间相当,但它应该可以工作。