首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带猴圈的最热夹具副

带猴圈的最热夹具副
EN

Stack Overflow用户
提问于 2015-11-05 21:09:04
回答 1查看 10.5K关注 0票数 10

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

代码语言:javascript
复制
@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]

我遇到的问题是,由于我的that函数只返回1,2,3。我尝试让patch_db固定设备执行params:

代码语言:javascript
复制
@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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-07 13:48:12

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

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

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

代码语言:javascript
复制
@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]
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33554815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档