ImportError: No module named mock

Question:

So I am trying to use unittest.mock to mock some of my methods in my unit tests. I do:

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

But I am getting:

ImportError: No module named mock

I tried:

pip install mock

It’s still not working.

Asked By: Richard Knop

||

Answers:

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.

Answered By: DSM

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.

Answered By: avasal

For Python 2.7:

Install mock:

pip install mock

Then in the test code, use this import:

from mock import patch, MagicMock
Answered By: Drew

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

from unittest import mock
Answered By: friederbluemle

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
Answered By: LSchueler

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.

Answered By: joseph

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.

Answered By: Boris Verkhovskiy