我想测试一个函数是否对传递给它的对象调用了__copy__
方法(带有一组给定的参数(。
由于创建对象需要DB连接,所以我认为应该对其进行模拟,并将模拟传递给函数进行测试。
然而,__copy__
似乎返回了一个mock(不确定是mock还是MagicMock(实例,该实例不允许在其上调用任意方法。由于我的代码在新对象上调用方法,因此它返回以下错误。
如何断言__copy__
方法已被调用,并且函数的其余部分仍能正常运行?
FWIW,我尝试分配old_obj.__class__.return_value = MagicMock()
,但它似乎没有返回我分配给它的内容(即,我也分配了... = 'foo'
,但它仍然返回了一个模拟对象(。
示例:
class MyClass:
def __init__(self, my_name):
self.my_name = my_name
def speak(self):
print('My name is ' + self.my_name)
def my_func(old_obj, new_name):
new_obj = old_obj.__class__(new_name)
new_obj.speak()
def test_my_func():
old_obj = MagicMock()
old_obj.my_name = 'foo'
my_func(old_obj, 'bar')
py.test产生的错误:
self = <MagicMock spec='str' id='4490339552'>, name = 'speak'
def __getattr__(self, name):
if name in {'_mock_methods', '_mock_unsafe'}:
raise AttributeError(name)
elif self._mock_methods is not None:
if name not in self._mock_methods or name in _all_magics:
> raise AttributeError("Mock object has no attribute %r" % name)
E AttributeError: Mock object has no attribute 'speak'
创建mock时需要提供spec
参数,否则任何调用或属性都将返回mock.Mock()
对象。
import unittest
from unittest import mock
class MyClass:
def __init__(self, my_name):
self.my_name = my_name
def speak(self):
print('My name is ' + self.my_name)
def my_func(old_obj, new_name):
new_obj = old_obj.__class__(new_name)
new_obj.speak()
def test_my_func():
old_obj = mock.MagicMock(spec=MyClass)
old_obj.my_name = 'foo'
my_func(old_obj, 'bar')
if __name__ == '__main__':
unittest.main()