代码之家  ›  专栏  ›  技术社区  ›  Jieke Wei

python side\u effect-方法的模拟行为

  •  10
  • Jieke Wei  · 技术社区  · 6 年前

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

    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传递给我们没有创建的mock。

    我是否使用了正确的side\u effect格式?

    谢谢你的帮助!

    1 回复  |  直到 6 年前
        1
  •  14
  •   Will Keeling    6 年前

    这里有几个问题。

    1. 您传递给 @patch 装饰师说得不太对。应将目标指定为单个参数:

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

      @patch('MyClass.foo')
      def test_foo(self, mock_foo):
      
    3. 然后可以将副作用设置为 mock\u 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()