在 pytest 参数化中传递函数

问题描述 投票:0回答:2

我想知道是否可以通过参数化将函数而不是可迭代对象传递给固定装置?

例如,我想做这样的事情。

import pytest

@pytest.fixture
def sample_data():
    data = 1
    return data

@pytest.fixture
def fixt(request):
    sample_data = request  # Not sure what the syntax should be here. 
    # Do something with sample_data
    return sample_data


@pytest.mark.parametrize("fixt", sample_data, indirect=True)
def test_indirect(fixt):
    assert fixt == 1

在我的实际项目中,我想将不同的示例数据帧传递给 MagicMock 对象。

到目前为止,我收到: TypeError: object of type 'SubRequest' has no len()

  • 因为我正在检查实际测试用例中数据帧的长度
python pytest
2个回答
0
投票

不确定我是否违反了这里的规则......但 ChatGPT 建议使用工厂固定装置。由于我需要实例化一个新的修复程序(每个测试使用不同的样本数据),这似乎解决了我的问题。

import pytest

@pytest.fixture
def sample_data():
    data = 1
    return data

@pytest.fixture
def fixt_factory():
   def fixt(sample_data):
    sample_data = sample_data
    # Do something with sample_data
    return sample_data
return fixt

def test_indirect(fixt):
    assert fixt == 1

0
投票

这是可能的,但您的实现中存在一些错误。 首先,您使用固定装置而不是函数 - 这将不起作用,因为您无法访问

parametrize
中的固定装置。其次,参数id在
request.param
中,而不是在
request
中。最后,您需要一个可迭代对象作为
parametrize
中的参数值。

所以,工作版本是:

import pytest

def sample_data():
    data = 1
    return data

@pytest.fixture
def fixt(request):
    sample_data = request.param
    return sample_data()


@pytest.mark.parametrize("fixt", [sample_data], indirect=True)
def test_indirect(fixt):
    assert fixt == 1
© www.soinside.com 2019 - 2024. All rights reserved.