python side_effect - 方法的模拟行为

问题描述 投票:5回答:1

在mock中,我希望某个函数在测试中返回一个新值。这就是我做到的。

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

谢谢你的帮助!

python mocking python-unittest side-effects
1个回答
5
投票

这里有一些问题。

  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. 最后,您应该在测试方法本身内部或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()
© www.soinside.com 2019 - 2024. All rights reserved.