python - 带有 monkeypatch 的 pytest fixture 参数

标签 python pytest

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

@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 fixture 接受参数:

@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:您尝试使用“模块”范围的请求对象访问“函数”范围的 fixture “monkeypatch”,涉及工厂

最佳答案

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

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

我建议您向 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]

关于python - 带有 monkeypatch 的 pytest fixture 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33554815/

相关文章:

python - 如何修复OpenCV Numpy错误,对象不可迭代

python - 无法将关键字 'items' 解析为字段。选项是 : id, 名称

python - 如何修改 pytest 参数?

python-2.7 - 在函数装饰器中使用 pytest 固定装置

python - 如何使 pytest 显示 fixture 参数的自定义字符串表示形式?

python - 在Visual Studio的Windows上安装MPIR时遇到问题吗?

python - 在 Python 中获取 numpy/scipy 中的日志比率

python - 如何修复 ImportError : No module named numpy?

python - pytest tmpdir_factory 测试 glob 搜索

python - 如何让 pytest hooks 打印到控制台?