Import Error: 没有名为 mock 的模块

因此,我尝试使用 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

还是没用。

123478 次浏览

unittest is a built-in module; mock is an external library (pre-3.3 betas, anyway). After installing mock via pip install, you import it not by using

from unittest.mock import MagicMock

but

from mock import MagicMock

Edit: mock has been included in the unittest module (since Python3.3), and can be imported by import unittest.mock.

For your version, I would suggest go to http://hg.python.org/cpython/file/default/Lib/unittest/mock.py and use this source to your advantage.

For Python 2.7:

Install mock:

pip install mock

Then in the test code, use this import:

from mock import patch, MagicMock

For some reason, import unittest.mock did not work for me, I had to do

from unittest import mock

If you want to support both, Python 2 and Python 3, you can also use following:

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

or, if you don't want to import sys

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

I was facing issues on import when running pytest. It turned out to be my pytest was of 2.7 version of python, while my virtualenv was a 3.6 python. I fixed it by doing a pip install from my virtualenv and then using the pytest from env/bin/pytest.

If you're using Python 3.3+, change

import mock

to

from unittest import mock

On older versions of Python, don't change anything in the code and run this shell command instead:

pip install mock

This import error happens because unittest.mock was added in Python 3.3, and there is a backport on PyPI for older Python versions. So if your code used to be Python 2, it's probably trying to import the backport.


pyupgrade is a tool you can run on your code to rewrite those imports and remove other no-longer-useful leftovers from Python 2.