微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – pytest fixture params with monkeypatch

我是猴子修补数据库连接类作为一个夹具.我想要完成的是将一些参数传递给我的猴子修补夹具,因为不同的测试都需要相同的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:您尝试使用’模块’范围的请求对象访问’function’范围夹具’monkeypatch’,涉及工厂

解决方法:

您不能使用模块夹具中的功能夹具,如消息所示.

如果你将patch_db的范围更改为function它将运行,但是这种方法将无法正常工作,因为test_get_somevalue会收到两个patch_db灯具,一个用[1,2,3]修补,另一个用[4,5,6]修补].

我建议你为FakeDbConnection添加一个函数,让测试设置他们想要取回的东西.这是完整的例子:

@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]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐