Python的mock抛出AttributeError: 'module'对象没有属性'patch'

6

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

根据文档几个其他网站的说法,我应该能够使用以下代码来使用patch:

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>

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

由于我的Python经验相当有限,所以我不确定可能出了什么问题。我相当确定正确的包已安装。请问如何帮助我使其正常工作?


6
你是否将文件命名为mock.py或类似的名称?检查mock.__file__并查看其返回结果。 - user2357112
1
@user2357112 你说得很接近。在Python搜索路径的一个目录中另有一个名为 mock.py 的文件。不确定它是从哪里来的,但在我删除它之后现在似乎一切都可以编译了。谢谢。 - c1moore
我将一个名为mock的子目录移动了过去,然后所有测试都以相同的错误失败,但是一旦我删除了mock目录,一切都正常了。 - Gang
如果您想写一个答案,我可以将其标记为正确的,这样您就可以获得应得的积分。 - c1moore
1个回答

3

为了完整起见,我想补充答案,但功劳归于@user2357112。

如果你遇到这个问题,请确保在python的搜索路径中没有另一个名为mock.py(或者你正在尝试导入的其他文件)。要确认你已经加载了正确的文件,你可以检查mock.__file__,这是Python自动添加到你导入的文件的属性。如果你正在使用终端,你可以做如下操作:

>>> import mock

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

如果文件路径不符合您的预期,您应该从搜索路径中删除正在导入的文件,或修改搜索路径,使您想要的文件首先被找到。如果以上两种方法都不可行,您需要更改导入的文件名称(如果这是您自己定义的文件,而不是类似mock的库文件)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接