【问题标题】:PyTest-Mock not working due to AttributeError由于 AttributeError,PyTest-Mock 无法正常工作
【发布时间】:2018-08-06 18:44:50
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 你能告诉我们目录结构吗?树。
  • 这两个文件和一个空的__init__.py文件都在根目录中

标签: python pytest


【解决方案1】:
  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'

【讨论】:

  • 非常感谢。我制作这个例子只是为了让我能够理解 Python 中模拟的基础知识,你的解释非常有帮助。
  • 很高兴能帮上忙!
  • 如果不导入 mocker,我将无法运行测试。如果没有在测试文件中导入,它在哪里进入命名空间?
  • @geekly mockerpytest-mock 插件提供的夹具。 pytest 在测试运行开始时收集所有夹具,并自动注入它们的返回值来代替与夹具名称匹配的测试函数参数。最好查看文档:pytest fixtures: explicit, modular, scalable.
  • 感谢您的解释。如果我什至不导入它,我仍然想知道它是如何找到模拟装置的。我知道 pytest-mock 是一个单独的模块,而不是 pytest 的一部分。听起来使用它的最低要求是安装 pytest-module 并在测试代码中引用“mocker”。这是真的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 2020-10-08
  • 2021-02-18
  • 2015-11-03
  • 2021-07-24
  • 1970-01-01
相关资源
最近更新 更多