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'的主要内容,如果未能解决你的问题,请参考以下文章

pytest-mock mock的高层封装

@Patch 装饰器与 pytest 夹具不兼容

python 在同一级别和mock.patch中编写pytest fixture

pytest - 模拟过程和时间

python - 本地mocker服务

pytest 配置文件