Python的模拟抛出AttributeError:'模块'对象没有属性' patch'

时间:2016-08-17 16:39:59

标签: python python-2.7 unit-testing

我正在尝试为Python程序创建一些测试。我使用的是Python版本2.7.12,因此我必须使用mock安装sudo pip install mock

根据documentationseveral other sites,我应该可以使用以下代码来使用补丁:

import mock     # Also could use from mock import patch
import unittest

class TestCases(unittest.TestCase):
    @mock.patch('MyClass.ImportedClass')   # If using from mock import patch should just be @patch
    def test_patches(self, mock_ImportedClass):
        # Test code...

但是,上面的代码会引发以下错误:

AttributeError: 'module' object has no attribute 'patch'

在终端进行了一些实验后,似乎有一些事情不起作用。例如

>>> import mock

>>> mock.MagicMock
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'MagicMock'

>>> mock.patch
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'patch'

>>> mock.Mock
<class mock.Mock at 0x7fdff56b0600>

有趣的是,我可以使用patch访问名为mock.Mock()的内容,但我不知道它是否以相同的方式工作,并且在文档中找不到任何相关内容。

我对Python的经验相当有限,所以我不确定可能出现的问题。我确定安装了正确的软件包。有关如何使其正常工作的任何帮助?

1 个答案:

答案 0 :(得分:0)

仅出于完整性考虑,我想添加答案,但是功劳归功于@ user2357112。

如果遇到此问题,请检查以确保在同一目录或python搜索路径中没有其他名为mock.py的文件(或尝试导入的任何文件)。要确认您已加载正确的文件,可以检查mock.__file_,这是python自动添加到导入文件的属性。如果您使用的是终端,则可以执行以下操作:

>>> import mock

>>> mock.__file__
'/usr/lib/python2.7/...'

如果文件路径与期望的路径不匹配,则应从搜索路径中删除正在导入的文件,或修改搜索路径,以便首先找到所需文件。如果这些都不是选项,则需要更改要导入的文件的名称(如果是您定义的文件,而不是模拟库)。