【问题标题】:How to mock a method of an imported instance如何模拟导入实例的方法
【发布时间】:2017-05-12 10:43:20
【问题描述】:

我正在为一些 python 模块编写单元测试。但是,我无法找到模拟导入实例的方法的方法。下面是我要测试的python模块。

--bar.py--

class A():
    @classmethod
    def method_1(self):
        ...    
a = A()

--foo.py--

from bar import a
class B():
    @classmethod
    def b(cls):
        if a.method_1():
            return True
        else:
            return False

--test_foo.py--

from foo import B

class TestB(TestCase):
    @patch('foo.a.method_1')
    def test_b(self, mock_method_1):
          mock_method_1.return_value = True
          test_b = B.b()
          ...

这不起作用。我的测试用例仍然调用原始的method_1 而不是我嘲笑的那个。

【问题讨论】:

  • 我第一次忘记在class A 中添加@classmethodmethod_1。所以现在我更新了帖子。
  • 我在我的桌面上测试了你的案例,似乎它按预期工作。你使用的是什么 Python 版本?也许是mock 包版本?
  • python==2.7,模拟==2.0.0。你的是什么?
  • 奇怪。与python==2.7.12mock==2.0.0 相同。我让 a.method_1() 返回 Falseassert test_b == True 。并且测试用例通过了,这意味着它调用了模拟方法。
  • 您是否按照您的问题尝试了上述示例?或者您正在使用您的原始完整代码库?也许我错过了一些东西。但是您可以尝试以下方法:在test_foo.py 中,不要使用from foo import B,而是使用import foofoo.B()

标签: python unit-testing mocking


【解决方案1】:

请改用patch.object decorator。它修补对象的属性而不是修补全局方法。

如果这不起作用,请尝试修补 bar.a 而不是 foo.a,但我认为这不是你的问题。

更新

问题改为类方法,所以我认为这会起作用:

--test_foo.py--

from foo import B

class TestB(TestCase):
    @patch('bar.A.method_1')
    def test_b(self, mock_method_1):
          mock_method_1.return_value = True
          test_b = B.b()
          ...

【讨论】:

  • 感谢patch.object 的建议。但我认为patch.objectpatch 之间的唯一区别是patch.object 允许您使用导入的东西而不是编写完整路径。反正我试过了,还是不行。
  • 是的,修补 bar.a 也无济于事。 :( 但仍然感谢您的帮助。
  • @MarineLu,我更新了答案以匹配您更新的问题。
猜你喜欢
  • 2018-06-21
  • 2014-05-06
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 2017-10-03
相关资源
最近更新 更多