104

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.

firelynx
  • 30,616
  • 9
  • 91
  • 101
Richard Knop
  • 81,041
  • 149
  • 392
  • 552

7 Answers7

130

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.

piggs_boson
  • 987
  • 2
  • 12
  • 25
DSM
  • 342,061
  • 65
  • 592
  • 494
24

For Python 2.7:

Install mock:

pip install mock

Then in the test code, use this import:

from mock import patch, MagicMock
Drew
  • 6,311
  • 4
  • 44
  • 44
16

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
LSchueler
  • 1,414
  • 12
  • 23
16

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.

Boris Verkhovskiy
  • 14,854
  • 11
  • 100
  • 103
8

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

from unittest import mock
friederbluemle
  • 33,549
  • 14
  • 108
  • 109
5

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.

joseph
  • 940
  • 10
  • 19
3

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.

Chris Martin
  • 30,334
  • 10
  • 78
  • 137
avasal
  • 14,350
  • 4
  • 31
  • 47