@Patch decorator is not compatible with pytest fixture

Hello lad picture Hello lad · Jul 31, 2014 · Viewed 19.9k times · Source

I have encountered something mysterious, when using patch decorator from mock package integrated with pytest fixture.

I have two modules:

    -----test folder
          -------func.py
          -------test_test.py

in func.py:

    def a():
        return 1

    def b():
        return a()     

in test_test.py:

    import pytest
    from func import a,b
    from mock import patch,Mock

    @pytest.fixture(scope="module")
    def brands():
        return 1


    mock_b=Mock()

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

It seems that patch decorate is not compatible with pytest fixture. Does anyone have a insight on that? Thanks

Answer

bux picture bux · Aug 17, 2018

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.