由于AttributeError,PyTest-Mock无法正常工作

时间:2018-08-06 18:44:51

标签: python pytest

我正在尝试使用PyTest_Mock以便在我的Python项目中进行一些测试。我创建了一个非常简单的测试来进行测试,但是却出现了AttributeError,我不知道为什么。

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

运行python -m pytest后,我失败了,并出现以下错误:

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

test_model.py:7: AttributeError

1 个答案:

答案 0 :(得分:3)

  1. 您不需要导入mocker,它可以作为Fixture使用,因此您只需将其作为参数传递给测试函数即可:

    def test_model(mocker):
        mocker.patch(...)
    
  2. square(5)的计算结果为25,因此mocker.patch(square(5))将有效地尝试对数字25进行修补。相反,将函数名称作为参数传递:或者

    mocker.patch('model.square')
    

    mocker.patch.object(model, 'square')
    
  3. 一旦修补,square(5)将不再返回25,因为将原始函数替换为可以返回任何内容的模拟对象,并且默认情况下将返回新的模拟对象。 assert model.square(5) == 25将因此失败。通常,您修补材料是为了避免复杂的测试设置,或者模拟测试场景中所需组件的行为(例如,网站不可用)。在您的示例中,您根本不需要嘲笑。

完整的工作示例:

import model

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

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