pytest fixture params with monkeypatch

时间:2015-11-05 21:09:04

标签: python pytest

我正在修补数据库连接类作为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使用params:

@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

1 个答案:

答案 0 :(得分:5)

正如消息所示,您无法使用function灯具中的module灯具。

如果您将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]