使用Flexmock模拟datetime.datetime.now



我正在尝试使用不同的工具来模拟,并找出最好的一个。我真的很喜欢flexmock,因为它很简单,但是我不知道如何模拟datetime.datetime.now()的行为。

如何模拟flexmock中的以下行为?

>>> from datetime import datetime
>>> mocker = Mocker()
>>> fake_datetime=mocker.replace(datetime)
>>> fake_datetime.now()
<mocker.Mock object at 0x027F1990>
>>> mocker.result(datetime(year=2012, month=12, day=12))
>>> mocker.replay()
>>> datetime.now()
datetime.datetime(2012, 12, 12, 0, 0)

当我尝试相同的flexmock:

>>> from datetime import datetime  
>>> fake_datetime = flexmock(datetime)
Traceback (most recent call last):
  File "C:virtualenvswebuilibsite-packagesflexmock.py", line 1194, in flexmock
    return _create_partial_mock(spec, **kwargs)
  File "C:virtualenvswebuilibsite-packagesflexmock.py", line 1013, in 
_create_partial_mock
if (_attach_flexmock_methods(mock, Mock, obj_or_class) and
  File "C:virtualenvswebuilibsite-packagesflexmock.py", line 1030, in
_attach_flexmock_methods
'Python does not allow you to mock builtin objects or modules. '
    'Python does not allow you to mock builtin objects or modules. '
MockBuiltinError: Python does not allow you to mock builtin objects or modules.
Consider wrapping it in a class you can mock instead

>>>flexmock(datetime).should_receive('datetime.now').and_return(datetime.datetime(2012,12,10))
>>> datetime.datetime.now()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'function' object has no attribute 'now'

你的第一种方法有正确的想法,但不幸的是Python不允许你修改内置对象,如datetime.datetime。Flexmock猴子-在运行时修补对象并劫持方法调用,这在这种情况下是不可能的。异常中的错误实际上提到了一个解决方案——您可以包装datetime。在你自己的课上约会,然后嘲笑它。但是,如果您真的想做mock在示例中所做的事情,并且只是使用now()方法创建一个假对象来返回您想要的结果,那么您可以很容易地做到这一点:

fake_datetime = flexmock(now=lambda: datetime(year=2012, month=12, day=12))

但是,当然,对datetime.now()的常规调用不会被flexmock劫持,除非您将伪造的datetime对象注入到调用代码中。

你的第二种方法产生了一个错误,因为datetime.should_receive('datetime.now')在flexmock中是用于链接方法调用的。这意味着它期望调用datetime。datetime().now()而不是datetime。datetime。now()所以它最终会抱怨datetime它期望是一个函数没有方法now()

相关内容

  • 没有找到相关文章

最新更新