2015-11-05 59 views
2

我是猴子修補數據庫連接類作爲夾具。我想要完成的是將一些參數傳遞給我的猴子修補夾具,因爲不同的測試都需要相同的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

+1

爲什麼在燈具中使用'scope ='module'',你需要這樣嗎?如果你放棄那部分它應該工作正常。 – Sebastian

回答

5

你不能從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]