gpt4 book ai didi

python - pytest:如何使用标记注入(inject) fixture ?

转载 作者:太空狗 更新时间:2023-10-30 02:53:11 27 4
gpt4 key购买 nike

我正在编写一个带有固定装置的 pytest 插件,该固定装置具有设置一些理想模拟的副作用。我想写一个简单的标记,允许用户在测试运行之前调用这个 fixture 设置,而不必在测试函数参数中包含 fixture ——本质上是使用标记“注入(inject)” fixture 。我的理由是用户可能想要模拟设置而不需要 fixture 本身的返回值,在这种情况下使用标记对我来说似乎比要求他们声明他们不会使用的 fixture 更直观。

我如何使用标记在 pytest 中要求固定装置?查看文档,似乎我想加入 pytest_collection_modifyitems 之类的东西,使用 Item.iter_markers 检查每个项目的相关标记,然后以某种方式更新列表固定装置。然而,阅读代码时,我无法弄清楚如何准确地触发该 fixture 设置。

这里有一个简单的例子,说明了所讨论的灯具的样子:

@pytest.fixture
def mocks(mocker):
ret_val = 10
mocker.patch('path.to.patch', return_value=ret_val)
return ret_val

用户现在可以执行以下操作来设置模拟:

def test_mocks(mocks):
# 'path.to.patch' will be mocked in this test
# ... test code ...

但是如果可以通过标记触发 fixture ,测试可能会是这样的:

@pytest.mark.mocks
def test_mocks():
# 'path.to.patch' will be mocked in this test, too
# ... test code ...

最佳答案

使用 usefixtures 标记:

# conftest.py
import pytest

@pytest.fixture
def mocks(mocker):
mocker.patch('os.path.isdir', return_value=True)

# test_me.py
import os
import pytest

@pytest.mark.usefixtures('mocks')
def test_mocks():
assert os.path.isdir('/this/is/definitely/not/a/dir')

传递多个固定装置也是可能的:

@pytest.mark.usefixtures('mocks', 'my_other_fixture', 'etc')

但是,有一个警告:代码中的 mocks fixture 返回一个值 ret_val。当通过测试函数 args 传递 fixture 时,该值在 mocks arg 下返回;当您使用标记时,您不再拥有 arg,因此您将无法使用该值。如果您需要模拟值,请在测试函数 args 中传递 fixture 。还有其他一些可以想象的方式,比如通过缓存传递 ret_val,但是,生成的代码将更复杂且可读性更差,所以我不会打扰。

关于python - pytest:如何使用标记注入(inject) fixture ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50593556/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com