Python的mock.patch没有在unittest中修补类

时间:2015-08-17 17:18:32

标签: python mocking

我在我的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被修补?

1 个答案:

答案 0 :(得分:6)

好的,第四次通过我认为我理解了模拟文档的'Where to patch'部分。

所以,而不是:

    @patch('app.fetch.FetcherA')

我应该使用:

    @patch('app.project.FetcherA')

因为我们正在app.project.MyClass中测试已导入FetcherA的代码。因此,此时FetcherAapp.project内有效地全局(?)。