87
votes

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.

7
this module is available in version 3.3 ,, what is your version - avasal
My version is 2.7. Is there any alternative? - Richard Knop
According to Google this should work also on 2.7. - Richard Knop

7 Answers

114
votes

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.

21
votes

For Python 2.7:

Install mock:

pip install mock

Then in the test code, use this import:

from mock import patch, MagicMock
15
votes

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
6
votes

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

from unittest import mock
6
votes

Change

import mock

to

from unittest import mock

This happens because unittest.mock is a builtin module starting with Python 3.3, but there is a backport on PyPI for older versions, which you can install as pip install mock and then import as import mock.

If you're using Python 3.3 or later, you don't need to pip install anything, you just have to import it as from unittest import mock.

4
votes

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.

3
votes

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.