Jie*_*Wei 6 python side-effects mocking python-unittest
在模拟中,我希望某个函数在测试中返回新值。这就是我做到的。
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()
Run Code Online (Sandbox Code Playgroud)
这给我一个错误:
无法将kwarg传递给我们未创建的模拟。
我使用的side_effect格式正确吗?
谢谢你的帮助!
这里有一些问题。
您传递给@patch装饰器的参数不太正确。目标应指定为单个参数:
@patch('MyClass.foo')
Run Code Online (Sandbox Code Playgroud)装饰的测试函数将需要为修补的目标接受一个附加参数-例如mock_foo:
@patch('MyClass.foo')
def test_foo(self, mock_foo):
Run Code Online (Sandbox Code Playgroud)然后,您可以在上设置副作用mock_foo:
@patch('MyClass.foo')
def test_foo(self, mock_foo):
mock_foo.side_effect = self._side_effect_foo
Run Code Online (Sandbox Code Playgroud)另外,_side_effect_foo()应使用self第一个参数作为适当的实例方法:
def _side_effect_foo(self, var1):
if condition:
return new_value
Run Code Online (Sandbox Code Playgroud)最后,您应该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()
Run Code Online (Sandbox Code Playgroud)