2016-01-12 37 views
0

我正在學習如何使用py.test編寫測試,但我不知道如何模擬外部調用。嘲笑py.test中的標準庫調用

讓說我有一個代碼來進行測試:

app.py:

import random 

def trade_robot(stock, price): 
    return ' '.join((random.choice(('buy', 'sell', 'keep')), stock)) 

我要確保我檢查案例random.choice決定我需要買(我想檢查它正確地加入字符串'買'的情況下)。

我的測試代碼應該是這樣的:

import pytest 
from app import trade_robot 
import sys 

def test_buy_case(): 
    # some mock magic here 
    assert trade_robot('AAPL', 500) == 'buy AAPL' 

if __name__ == "__main__": 
    pytest.main("-v %s" % sys.argv[0]) 

應該在「一些模擬魔法」是什麼讓這個測試通過每一次?謝謝!

回答

1

可與圖書館mock,其中因爲Python 3.3,計入standard library來完成。

首先,與上下文經理:

import random 
with mock.patch.object(random, 'choice') as m: 
    m.return_value = 'buy' 
    print random.choice(['anything']) # prints 'buy' regardless of the arguments 

與裝飾相同:

@mock.patch.object(random, 'choice') 
def test_buy(m): 
    m.return_value = 'buy' 
    print random.choice(['anything']) 

該庫還可以作出有關呼籲模仿,不可替代的單元測試的斷言。或者,有些人更喜歡顯式依賴性反轉,這意味着將函數random.choice作爲函數/方法/構造函數參數傳遞到您的代碼中,並在測試中將其替換爲模擬。

+0

謝謝!我已經測試了這段代碼,並且我可以在測試函數中使用上下文管理器:使用mock.patch.object(random,'choice')as m:m.return_value ='buy'assert trade_robot('AAPL',500) =='買AAPL'。它的工作原理! –