如何在Python中对复制的MagicMock调用方法



我想测试一个函数是否对传递给它的对象调用了__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()

相关内容

  • 没有找到相关文章

最新更新