模拟python内置日期时间不作为装饰工作

时间:2014-08-22 23:18:43

标签: python testing mocking

为什么会失败:

@patch.object(datetime, 'datetime', Mock(wraps=datetime.datetime))
def test(self, dt_mock):
    dt_mock.utcnow.return_value = datetime.datetime(2014, 1, 1)
    self.assertEqual(datetime.datetime(2014, 1, 1), datetime.datetime.utcnow())

Error
Traceback (most recent call last):
  File "/Users/user/.virtualenvs/project/lib/python2.7/site-packages/mock.py", line 1201, in patched
    return func(*args, **keywargs)
TypeError: test() takes exactly 2 arguments (1 given)

当这个工作正常时:

def test(self):
    with patch.object(datetime, 'datetime', Mock(wraps=datetime.datetime)) as dt_mock:
        dt_mock.utcnow.return_value = datetime.datetime(2014, 1, 1)
        self.assertEqual(datetime.datetime(2014, 1, 1), datetime.datetime.utcnow())
mock.py中的

_patch_object只是调用_patch类构造函数,我不知道如何将被模拟的参数提供给修饰的测试方法。

1 个答案:

答案 0 :(得分:1)

问题是patch.object的3参数形式没有发出被修补的对象作为被装饰函数的参数,我之前从未使用过该版本; - )

来自relevant documentation

  

您可以使用三个或两个参数调用patch.object   参数。三个参数形式将对象修补,即   属性名称和用。替换属性的对象。

     

使用两个参数表单调用时,省略替换   对象,并为您创建模拟并作为额外传递   装饰函数的参数......

修正测试:

@patch.object(datetime, 'datetime', Mock(wraps=datetime.datetime))
def test(self):
    datetime.datetime.utcnow.return_value = datetime.datetime(2014, 1, 1)
    self.assertEqual(datetime.datetime(2014, 1, 1), datetime.datetime.utcnow())

感谢@univerio向我展示了我的方式错误......