python side_effect-方法的模拟行为

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格式正确吗?

谢谢你的帮助!

Wil*_*ing 5

这里有一些问题。

  1. 您传递给@patch装饰器的参数不太正确。目标应指定为单个参数:

    @patch('MyClass.foo')
    
    Run Code Online (Sandbox Code Playgroud)
  2. 装饰的测试函数将需要为修补的目标接受一个附加参数-例如mock_foo

    @patch('MyClass.foo')
    def test_foo(self, mock_foo):
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后,您可以在上设置副作用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)
  4. 另外,_side_effect_foo()应使用self第一个参数作为适当的实例方法:

    def _side_effect_foo(self, var1):
        if condition:
            return new_value
    
    Run Code Online (Sandbox Code Playgroud)
  5. 最后,您应该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)