【问题标题】:python side_effect - mocking behavior of a methodpython side_effect - 方法的模拟行为
【发布时间】:2018-09-08 10:04:34
【问题描述】:

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

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】:

    这里有几个问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多