我是猴子修补一个数据库连接类作为一个固定的。我想要完成的是将一些参数传递给我的猴子补丁夹具,因为不同的测试都需要相同的猴子区,但返回值不同。
@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:
@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
发布于 2015-11-07 13:48:12
正如消息所述,您不能从function夹具中使用module夹具。
如果将修补程序_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]https://stackoverflow.com/questions/33554815
复制相似问题