pytest夹具参数与monkeypatch
问题描述:
我是猴子修补数据库连接类作为夹具。我想要完成的是将一些参数传递给我的猴子修补夹具,因为不同的测试都需要相同的monkeypatch,但返回值不同。pytest夹具参数与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夹具采取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
答
你不能从module
夹具使用function
夹具,因为有消息称。
如果更改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]
为什么在灯具中使用'scope ='module'',你需要这样吗?如果你放弃那部分它应该工作正常。 – Sebastian