Pytest mocker patch Attribute:Error 'function' object has no attribute 'patch'
Posted
技术标签:
【中文标题】Pytest mocker patch Attribute:Error \'function\' object has no attribute \'patch\'【英文标题】:Pytest mocker patch Attribute:Error 'function' object has no attribute 'patch'Pytest mocker patch Attribute:Error 'function' object has no attribute 'patch' 【发布时间】:2019-10-23 13:05:40 【问题描述】:我正在尝试模拟我使用 mocker.patch.object 创建的另一个方法。但是我得到了AttributeError。刚开始使用 mocker,但还没有看到可以帮助解决这种情况的示例。
尝试了从 mocker 调用方法的不同方式。
在测试/test_unit.py 中
from pytest_mock import mocker
class TestApp:
def setup_method(self):
self.obj = ClassApi()
def test_class_api_method(self, client):
return_value = 'name': 'test'
mocker.patch.object(self.obj, 'method_to_mock')
mocker.result(return_value)
在项目/服务中
class ClassApi:
def method_to_mock(self, input1):
...
return result
AttributeError: 'function' 对象没有属性 'patch'
【问题讨论】:
【参考方案1】:我对 Pytest-Mock 不是很熟悉,但根据查看文档,您应该使用 mocker
作为夹具。所以你的函数应该是这样的:
def test_class_api_method(self, client, mocker):
return_value = 'name': 'test'
mocker.patch.object(self.obj, 'method_to_mock')
mocker.result(return_value)
pytest 在运行时自动为测试函数提供参数 mocker,因此无需导入它。
【讨论】:
成为一个灯具意味着什么?为什么会这样? 夹具是来自 pytest 库的构造。在实践中,您声明一个函数并用@pytest.fixture()
装饰它。现在每当你声明一个测试函数时,你都可以指定夹具名称(函数名称)作为参数,pytest 会将调用夹具函数的结果作为参数注入。
我想将它作为参数传递给 test_function() 是正确评估嘲笑者以便按照 OP 预期使用的唯一真正方法。导入不起作用,因为......(我不确定为什么导入不起作用)。为什么导入它不起作用?
我刚刚意识到,fixture 是 pytest 有自己实现的附加功能。因此 OP 使用它的方式是不正确的,并且有一种特定的方式可以使用固定装置来保留对象的状态。导入它没有好处,因为它只是一个 NOOP。我想我现在明白了。以上是关于Pytest mocker patch Attribute:Error 'function' object has no attribute 'patch'的主要内容,如果未能解决你的问题,请参考以下文章