【问题标题】:pytest how to pass request fixture through intermediary fixturepytest如何通过中间夹具传递请求夹具
【发布时间】:2021-06-21 13:00:28
【问题描述】:

我有(在 pytest 中):

  • base 使用 request.param 的夹具
  • 使用base 夹具的intermediary 夹具
  • 使用intermediary 夹具的测试,我想parameterize base 夹具

下面的代码示例将有助于解释:

import pytest

@pytest.fixture
def base(request) -> int:
    return request.param

@pytest.fixture
def intermediary(base: int) -> int:
    return base

# This does not work!  "In test_something: indirect fixture 'base' doesn't exist"
@pytest.mark.parametrize("intermediary", [1], indirect=["base"])
def test_something(intermediary: int) -> None:
    assert isinstance(intermediary, int)

我的问题:如何从仅使用 intermediary 夹具的测试中填充 requestbase 夹具?


解决方法

在测试签名作品中包含基本夹具:

@pytest.mark.parametrize("base", [1], indirect=True)
def test_something_workaround(base: int, intermediary: int) -> None:
    assert isinstance(intermediary, int)

但是,这对我来说是不可取的,因为测试实际上并没有使用base,而只使用了intermediary


版本

Python==3.8
pytest==6.2.2

【问题讨论】:

    标签: python pytest fixtures


    【解决方案1】:

    你几乎可以这样做,但你必须使用“base”作为parametrize中的夹具名称:

    @pytest.fixture
    def base(request) -> int:
        return request.param
    
    
    @pytest.fixture
    def intermediary(base: int) -> int:
        return base + 1
    
    
    @pytest.mark.parametrize("base", [1], indirect=True)
    def test_something(intermediary: int) -> None:
        assert intermediary == 2
    

    例如你参数化夹具base,但使用派生夹具,然后从base 获取结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多