python side_effect - 方法的模拟行为

python side_effect - mocking behavior of a method

在模拟中,我想要某个函数在测试中return一个新值。我就是这样做的。

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()

这给了我一个错误:

Can't pass kwargs to a mock we aren't creating.

我使用的 side_effect 格式是否正确?

感谢您的帮助!

这里有一些问题。

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

    @patch('MyClass.foo')
    
  2. 您的修饰测试函数将需要接受修补目标的附加参数 - 例如mock_foo:

    @patch('MyClass.foo')
    def test_foo(self, mock_foo):
    
  3. 然后您可以在 mock_foo 上设置副作用:

    @patch('MyClass.foo')
    def test_foo(self, mock_foo):
        mock_foo.side_effect = self._side_effect_foo
    
  4. 此外,_side_effect_foo()应该作为第一个参数self的适当实例方法:

    def _side_effect_foo(self, var1):
        if condition:
            return new_value
    
  5. 最后,您应该在测试方法本身或 setUp() 方法内部实例化 MyClass

    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()