【发布时间】:2019-01-08 04:35:54
【问题描述】:
我想断言 say_name 是使用列表 name 中的每个值调用的。
from unittest.mock import patch
class MyClass:
def __init__(self, name):
self.name = name
def say_name(name):
print('My name is ' + name)
def my_func():
names = ['foo', 'bar', 'baz']
objects = [MyClass(name) for name in names]
[say_name(object.name) for object in objects]
@patch('my_test.say_name', spec_set=True)
@patch('my_test.MyClass', spec_set=True)
def test_my_func(mock_my_class, mock_say_name):
names = ['foo', 'bar', 'baz']
my_func()
[mock_my_class.assert_any_call(name) for name in names]
# [mock_say_name.assert_any_call(x.name) for x in xs]
如果只创建MyClass 的一个实例,通常情况下,我可以通过设置mock_my_class.return_value = PropertyMock(name=name) 来设置属性。
但是,在这种情况下,会创建多个不同的 MyClass 实例。
因此,此代码将引发错误,因为 my_func 由测试人员执行,say_name 正在传递一个没有 name 属性的模拟。
那么,如何为不同的 MagicMock 实例设置不同的属性呢?
【问题讨论】:
-
@wim 我正在使用 py.test 运行测试。
标签: python unit-testing patch magicmock