我正在猴子修补数据库连接类作为固定装置。我想要完成的是将一些参数传递给我的 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/