2011-05-16 26 views
4

我使用py.test,真的很喜歡funcarg方法將對象注入測試函數。 在我的測試中,我需要使用Mock對象,因爲我有很多外部依賴項。我使用monkeypatch來替換模擬對象的某些屬性。py.test在自定義funcargs中使用monkeypatch

我遇到的問題是,我經常會得到一堆測試,這些測試將使用某個funcarg並始終需要修補相同的屬性。到目前爲止,我替換了每個測試函數中的屬性。

有沒有辦法在我的funcarg函數中使用monkeypatch,並從單個測試中刪除這個重複的代碼?

import sys 
import pytest 
from mock import Mock 


#---------------------------------------------------------------------- 
def pytest_funcarg__api(request): 
    """""" 
    api = myclass() 
    #do some initialisation... 
    return api 


#---------------------------------------------------------------------- 
def test_bla1(monkeypatch, api): 
    """""" 
    monkeypatch.setattr(api,"get_external_stuff",Mock()) 
    monkeypatch.setattr(api,"morestuff",Mock()) 

    api.do_something1() 
    assert not api.a 

#---------------------------------------------------------------------- 
def test_bla2(monkeypatch, api): 
    """""" 
    monkeypatch.setattr(api,"get_external_stuff",Mock()) 
    monkeypatch.setattr(api,"morestuff",Mock()) 

    api.do_something2() 
    assert api.b 


if __name__=='__main__': 
    pytest.main(args=["-v",sys.argv[0]]) 

回答

6

可以使用記錄getfuncargvalue函數內部使用一個函數的參數從另一個函數參數的工廠:

def pytest_funcarg__api(request): 
    api = myclass() 
    #do some initialisation... 
    mp = request.getfuncargvalue("monkeypatch") 
    mp.setattr(api,"get_external_stuff", Mock()) 
    mp.setattr(api,"morestuff", Mock()) 
    return api 
+0

我同意這樣更優雅。不知何故,我在閱讀文檔時錯過了這個... – circus 2011-05-18 09:01:07

2

這應該工作:

def pytest_funcarg__api(request): 
    """""" 
    api = myclass() 
    #do some initialisation... 
    mp_plugin = request.config.pluginmanager.getplugin("monkeypatch") 
    monkeypatch = mp_plugin.pytest_funcarg__monkeypatch(request) 
    monkeypatch.setattr(api,"get_external_stuff",Mock()) 
    monkeypatch.setattr(api,"morestuff",Mock()) 
    return api 

這裏的技巧是兩方面:

  1. 我們得到使用config.pluginmanagermonkeypatch插件。
  2. 我們欺騙monkeypatch插件,通過調用它的pytest_funcarg__monkeypatch() funcarg接口和我們自己的請求對象,認爲它被py.test的依賴注入代碼調用。
+0

感謝,做工精細。 – circus 2011-05-16 20:50:59

相關問題