2014-04-04 59 views
2

我無法找到在文檔,谷歌或SO上使用pytest測試回調的具體示例。我發現這個:What is the right way to test callback invocation using Python unittest?;但它是單元測試。我猜測pytest的monkeypatch功能是我應該看的地方,但我是新來的自動化測試,並且正在尋找一個例子。有pytest測試回調的首選方法嗎?

def foo(callback): 
    callback('Buzz', 'Lightyear') 

#--- pytest code ---- 
def test_foo(): 
    foo(hello) 
    # how do I test that hello was called? 
    # how do I test that it was passed the expected arguments? 

def hello(first, last): 
    return "hello %s %s" % first, last 

在此先感謝您。

回答

4

這個想法還是一樣的。

您需要用Mock代替hello()函數,或者換句話說,「模擬」函數。

然後你可以使用assert_called_with()來檢查它是否被你需要的特定參數調用。

+0

模擬文檔特別聲明,它的目的是與unittest一起使用,所以我在發佈之前取消了該解決方案的資格。我意識到pytest將與Mock一起工作,但我正在尋找更具針對性的特定解決方案。一般來說,我寧願避免額外的軟件包依賴。有關參考資料,請參閱http://www.voidspace.org.uk/python/mock/:「Mock非常易於使用,專爲單元測試而設計。」 – guyja

+0

@guyja好吧,一般來說,'mock'模塊是必備的工具,如果你想要一個很好的覆蓋或測試特定的難以複製的情況。對於模擬本身,使用什麼測試框架並不重要。我一直在用鼻子''mock'很長一段時間。 – alecxe

+0

我對讀這兩個文檔的第一反應是他們的目標是解決同樣的問題。如果Mock是標準,那麼何時/爲什麼我應該使用pytest的monkeypatch功能來代替Mock。 – guyja

1

這是我的應用@alecxe提供的答案後的工作代碼。

def foo(callback): 
    callback('Buzz', 'Lightyear') 

#--- pytest code --- 

import mock 

def test_foo(): 
    func = mock.Mock() 

    # pass the mocked function as the callback to foo 
    foo(func) 

    # test that func was called with the correct arguments 
    func.assert_called_with('Buzz', 'Lightyear') 

謝謝。