我正在尝试使用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
答案 0 :(得分:3)
您不需要导入mocker
,它可以作为Fixture使用,因此您只需将其作为参数传递给测试函数即可:
def test_model(mocker):
mocker.patch(...)
square(5)
的计算结果为25,因此mocker.patch(square(5))
将有效地尝试对数字25进行修补。相反,将函数名称作为参数传递:或者
mocker.patch('model.square')
或
mocker.patch.object(model, 'square')
一旦修补,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'