【问题标题】:pytest fixture params with monkeypatch带有monkeypatch的pytest夹具参数
【发布时间】:2015-11-05 21:09:04
【问题描述】:

我正在猴子修补数据库连接类作为固定装置。我想要完成的是将一些参数传递给我的猴子补丁夹具,因为不同的测试都需要相同的猴子补丁,但返回值不同。

@pytest.fixture
def data():
    now = datetime.datetime.now()
    data = Data(now)
    return data

@pytest.fixture
def patch_db(monkeypatch):
    class FakeDbConnection:
        def __init__(*args, **kwargs):
            pass

        def fetchall(self):
            return [1,2,3]

    monkeypatch.setattr(DbConnection, 'execute', FakeDbConnection)


def test_get_somevalue(patch_db, data):
    userids = data.get_userids()
    assert userids == [1,2,3]

def test_get_something_else(patch_db, data):
    userids = data.get_userids()
    assert userids == [6,7,8]

我遇到的问题是,因为我的 fetchall 函数只返回 [1,2,3]。我试图让 patch_db 夹具获取参数:

@pytest.fixture(scope='module', params=[[1, 2, 3], [4, 5, 6]])
def patch_db(monkeypatch, test_values):
    class FakeDbConnection:
        def __init__(*args, **kwargs):
            pass

        def fetchall(self):
            return test_values.param

    monkeypatch.setattr(DbConnection, 'execute', FakeDbConnection)

但我收到以下错误: ScopeMismatch: You tried to access the 'function' scoped fixture 'monkeypatch' with a 'module' scoped request object, involved factories

【问题讨论】:

  • 你为什么在夹具中使用scope='module',你需要这样吗?如果你放下那部分,它应该可以正常工作。

标签: python pytest


【解决方案1】:

如消息所述,您不能使用 module 夹具中的 function 夹具。

如果您将 patch_db 的作用域更改为 function,它将运行,但这种方法不会像您预期的那样工作,因为 test_get_somevalue 会收到两个 patch_db 固定装置,一个用 [1, 2, 3] 修补,另一个用 @ 修补987654327@.

我建议您向FakeDbConnection 添加一个函数,让测试设置他们希望fetchall 返回的内容。这是完整的示例:

@pytest.fixture
def data():
    now = datetime.datetime.now()
    data = Data(now)
    return data


@pytest.fixture
def patch_db(monkeypatch):
    class FakeDbConnection:
        def __init__(*args, **kwargs):
            pass

        def fetchall(self):
            return fetch_result.values

    monkeypatch.setattr(DbConnection, 'execute', FakeDbConnection)

    class FetchResult:
        pass

    fetch_result = FetchResult()
    fetch_result.values = None
    return fetch_result


def test_get_somevalue(patch_db, data):
    patch_db.values = [1,2,3]
    userids = data.get_userids()
    assert userids == [1,2,3]


def test_get_something_else(patch_db, data):
    patch_db.values = [6,7,8]
    userids = data.get_userids()
    assert userids == [6,7,8]

【讨论】:

  • 可以使用@pytest.mark.parametrize("values", [[1,2,3], [6,7,8]] )合并测试函数
猜你喜欢
  • 2021-12-19
  • 1970-01-01
  • 2022-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多