【发布时间】: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中添加@classmethod到method_1。所以现在我更新了帖子。 -
我在我的桌面上测试了你的案例,似乎它按预期工作。你使用的是什么 Python 版本?也许是
mock包版本? -
python==2.7,模拟==2.0.0。你的是什么?
-
奇怪。与
python==2.7.12和mock==2.0.0相同。我让a.method_1()返回False和assert test_b == True。并且测试用例通过了,这意味着它调用了模拟方法。 -
您是否按照您的问题尝试了上述示例?或者您正在使用您的原始完整代码库?也许我错过了一些东西。但是您可以尝试以下方法:在
test_foo.py中,不要使用from foo import B,而是使用import foo和foo.B()。
标签: python unit-testing mocking