我在我的python单元测试中使用Mock感到困惑。我已经制作了这个问题的简化版本:
我有这个虚拟类和方法:
# app/project.py
class MyClass(object):
def method_a(self):
print FetcherA
results = FetcherA()
使用此课程:
# app/fetch.py
class FetcherA(object):
pass
然后这个测试:
# app/tests/test.py
from mock import patch
from django.test import TestCase
from ..project import MyClass
class MyTestCase(TestCase):
@patch('app.fetch.FetcherA')
def test_method_a(self, test_class):
MyClass().method_a()
test_class.assert_called_once_with()
我希望运行此测试会通过,并且用于调试的print
语句将输出类似<MagicMock name=...>
的内容。相反,它打印出<class 'app.fetch.FetcherA'>
,我得到:
AssertionError: Expected to be called once. Called 0 times.
为什么没有FetcherA
被修补?
答案 0 :(得分:6)
好的,第四次通过我认为我理解了模拟文档的'Where to patch'部分。
所以,而不是:
@patch('app.fetch.FetcherA')
我应该使用:
@patch('app.project.FetcherA')
因为我们正在app.project.MyClass
中测试已导入FetcherA
的代码。因此,此时FetcherA
在app.project
内有效地全局(?)。