@Patch decorator is not compatible with pytest fixture

When using pytest fixture with mock.patch, test parameter order is crucial.

If you place a fixture parameter before a mocked one:

from unittest import mock

@mock.patch('my.module.my.class')
def test_my_code(my_fixture, mocked_class):

then the mock object will be in my_fixture and mocked_class will be search as a fixture:

fixture 'mocked_class' not found

But, if you reverse the order, placing the fixture parameter at the end:

from unittest import mock

@mock.patch('my.module.my.class')
def test_my_code(mocked_class, my_fixture):

then all will be fine.


As of Python3.3, the mock module has been pulled into the unittest library. There is also a backport (for previous versions of Python) available as the standalone library mock.

Combining these 2 libraries within the same test-suite yields the above-mentioned error:

E       fixture 'fixture_name' not found

Within your test-suite's virtual environment, run pip uninstall mock, and make sure you aren't using the backported library alongside the core unittest library. When you re-run your tests after uninstalling, you would see ImportErrors if this were the case.

Replace all instances of this import with from unittest.mock import <stuff>.


This doesn't address your question directly, but there is the pytest-mock plugin which allows you to write this instead:

def test_compute_scores(brands, mock):                 
     mock_b = mock.patch('test_test.b')
     a()