2014-02-19 91 views
1

該測試是給我的異常問題的API:修補使用Python模擬

我測試的略微簡化的版本:

def test_credit_create_view(self): 
    """ Can we create cards? """ 
    card_data = {'creditcard_data': 'blah blah blah'} 
    with patch('apps.users.forms.CustomerAccount.psigate') as psigate: 
     info = MagicMock() 
     info.CardInfo.SerialNo = 42 
     create = MagicMock(return_value=info) 
     psigate.credit.return_value = create 
     self.client.post('/make-creditcard-now', card_data) 

我試圖模仿看起來像這樣的電話:

psigate.credit().create().CardInfo.SerialNo 

在測試中,該調用只返回一個MagicMock對象。

如果我只是看在通話的最後三個節點,我得到正確的結果:

create().CardInfo.SerialNo 

收益42

爲什麼不充分調用「psigate.credit() .create().CardInfo.SerialNo'return 42?

+0

CardInfo應該是什麼?一類?如果是這樣,你可以查看[PropertyMock](http://www.voidspace.org.uk/python/mock/mock.html#mock.PropertyMock) – Silfheed

+0

CardInfo是一個lxml.objectify.ObjectifiedElement。我不得不承認我很困惑應該在什麼時候使用PropertyMock。 – LiavK

回答

2

您正在設置創建psigate.credit的返回值,這意味着psigate.credit()是您的模擬「創建」,而不是psigate.credit()。create。如果你調用了psigate.credit()(),這可以按預期工作。

當您調用psigate.credit()。create()時,您正在動態創建一個新的MagicMock對象,而不是調用您定義的對象。

+0

再次看看模擬文檔。您可以一次性在return_value上設置屬性。以下工作:psigate.credit.return_value.create.return_value.CardInfo.SerialNo = 42 – LiavK