在模拟中,我希望某个函数在测试中返回一个新值。这就是我做到的。
Class MyClass:
my_var = None
def foo(self, var1):
return somevalue
def bar(self):
my_var = foo(1)
Class TestClass(unittest.TestCase):
myClass = MyClass()
def _side_effect_foo(var1):
if condition:
return new_value
@patch("MyClass", "foo", side_effect='_side_effect_foo')
def test_foo(self):
self.myClass.bar()
这给了我一个错误:
无法将kwargs传递给我们不会创建的模拟。
我使用的是side_effect的正确格式吗?
感谢您的帮助!
答案 0 :(得分:4)
这里有一些问题。
您传递给@patch
装饰者的论点并不完全正确。应将目标指定为单个参数:
@patch('MyClass.foo')
您的修饰测试函数需要接受修补目标的附加参数 - 例如mock_foo
:
@patch('MyClass.foo')
def test_foo(self, mock_foo):
然后,您可以在mock_foo
上设置副作用:
@patch('MyClass.foo')
def test_foo(self, mock_foo):
mock_foo.side_effect = self._side_effect_foo
此外,_side_effect_foo()
应该是self
作为第一个参数的正确实例方法:
def _side_effect_foo(self, var1):
if condition:
return new_value
最后,您应该在测试方法本身内部或MyClass
方法内实例化setUp()
:
def setUp(self):
self.myClass = MyClass()
@patch('MyClass.foo')
def test_foo(self, mock_foo):
mock_foo.side_effect = self._side_effect_foo
self.myClass.bar()