D Haze
D Haze

Reputation: 159

PyTest-Mock not working due to AttributeError

I am trying to use PyTest_Mock in order to do some testing in my Python project. I created a very simple test to try it out, but I am getting an AttributeError and I don't know why.

model.py

def square(x):
    return x * x

if __name__ == '__main__':
    res = square(5)
    print("result: {}".format(res))

test_model.py

import pytest
from pytest_mock import mocker

import model

def test_model():
    mocker.patch(square(5))

    assert model.square(5) == 25

After running python -m pytest I get a failure and the following error:

    def test_model():
>       mocker.patch(square(5))
E       AttributeError: 'function' object has no attribute 'patch'

test_model.py:7: AttributeError

Upvotes: 3

Views: 6760

Answers (1)

hoefling
hoefling

Reputation: 66171

  1. You don't need to import mocker, it's available as fixture, so you just pass it as a parameter in the test function:

    def test_model(mocker):
        mocker.patch(...)
    
  2. square(5) evaluates to 25, so mocker.patch(square(5)) will effectively try to patch a number 25. Instead, pass the function name as parameter: either

    mocker.patch('model.square')
    

    or

    mocker.patch.object(model, 'square')
    
  3. Once patched, square(5) will not return 25 anymore since the original function is replaced with a mock object that can return anything and will return a new mock object by default. assert model.square(5) == 25 will thus fail. Usually, you patch stuff either to avoid complex test setup or simulate behaviour of components that is desired in test scenario (for example, a website being unavailable). In your example, you don't need mocking at all.

Complete working example:

import model

def test_model(mocker):
    mocker.patch.object(model, 'square', return_value='foo')

assert model.square(5) == 'foo'

Upvotes: 6

Related Questions