python side_effect - 方法的模拟行为

标签 python mocking python-unittest side-effects

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

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

关于python side_effect - 方法的模拟行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49556209/

相关文章:

python - 如何优雅地替换字符串中的每个元素(字符)?

python - 在 Python 中调用父类中的子方法

python - Boto:将多个文件上传到 s3

c++ - 是否可以在非托管代码中使用 Mock/Fake 框架?

reflection - 如何使用反射实现或模拟Go接口(interface)?

python-unittest - 如果另一个先前的测试方法在 Python 中使用 unittest 失败,如何跳过一个测试方法?

python - Django 休息 : 'Request' object has no attribute 'field_name'

java - Mockito:返回传递的参数

python - 单元测试 : test not failing if using try-except

python - 如何防止每次运行测试用例时移动应用程序关闭并重新打开?