导入错误:没有名为mock的模块。

105

我正在尝试使用unittest.mock来在我的单元测试中模拟一些方法。我执行以下操作:

from unittest.mock import MagicMock
f = open("data/static/mock_ffprobe_response")
subprocess.check_output = MagicMock(return_value=f.read())
f.close()

但我得到的是:

ImportError: No module named mock

我尝试了:

pip install mock

仍然不起作用。


1
此模块可在版本3.3中使用,您的版本是什么? - avasal
1
我的版本是2.7。有没有其他的选择? - Richard Knop
1
根据谷歌的说法,这也应该适用于2.7版本。 - Richard Knop
7个回答

130

unittest是一个内置模块;而mock是一个外部库(在 3.3 beta 版本之前)。安装完mock后,你可以通过 pip install 来导入它。

from unittest.mock import MagicMock

但是

from mock import MagicMock

编辑:mock已包含在unittest模块中(自Python3.3起),可以通过import unittest.mock导入。


1
在Python 3.3+中,您需要执行与此答案建议的相反操作:from unittest.mock import MagicMock - user3064538

24

对于 Python 2.7:

安装 mock:

pip install mock

然后在测试代码中,使用这个导入:

from mock import patch, MagicMock

17
如果您使用的是Python 3.3或更高版本,请进行以下更改。
import mock

from unittest import mock

或者你可以保持所有代码不变,而是运行这个shell命令:
pip install mock

这个命令适用于任何Python版本,但最好修改代码,这样其他人运行你的代码时就不会再遇到导入错误了。
这个错误发生的原因是因为在Python 3.3中添加了unittest.mock,而在PyPI上有一个回溯适用于旧版本的Python。所以如果你的代码曾经是Python 2,它可能试图导入回溯版本。
pyupgrade 是一个可以在你的代码上运行的工具,用于重写那些导入语句并删除 Python 2 中不再有用的其他残留代码。

16

如果你想同时支持Python 2和Python 3,可以使用以下代码:

import sys
if sys.version_info >= (3, 3):
    from unittest.mock import MagicMock
else:
    from mock import MagicMock

或者,如果您不想导入sys

try:
    from unittest.mock import MagicMock
except ImportError:
    from mock import MagicMock

8

由于某些原因,import unittest.mock 对我不起作用,我需要执行以下操作:

from unittest import mock

5
我在运行pytest时遇到了导入问题。原来是因为我的pytest版本是2.7的python,而我的virtualenv版本是3.6的python。我通过从virtualenv中进行pip安装并使用env/bin/pytest中的pytest来解决了这个问题。

3

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