为什么会失败:
@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类构造函数,我不知道如何将被模拟的参数提供给修饰的测试方法。
答案 0 :(得分:1)
问题是patch.object
的3参数形式没有发出被修补的对象作为被装饰函数的参数,我之前从未使用过该版本; - )
您可以使用三个或两个参数调用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向我展示了我的方式错误......