我有一個我想測驗的函式。datahandler引數是一個類Datahandler的實體,我已經在模塊的其他地方定義了這個類。
def create_row(row_content, datahandler)。
行 = {}
# Here comes some code that fills the "row" dictionary based on what was passed in row_content.
row = datahandler.process_row(row)
# 對已處理的行還會有一些處理。
return row
我試著寫了一個單元測驗,但是我遇到了困難,因為我似乎找不到一種方法來替換一個模擬的資料處理程式的process_row方法:
class TestCreateRow(unittest.TestCase)。
def fake_process_row(row)。
return row
def test_create_row(self)。
# 在這里創建一個合適的row_content。
# row_content = ....
expected = {"第一列":"第一值", "第二列":"第二值"}。
datahandler = Mock()
# !!! 這不起作用--正確的解決方案是什么?
datahandler.process_row = self.fake_process_row
result = create_row(row_content, datahandler)
self.assertDictEqual(expected, result)
我嘗試使用return_value和side_effects將fake_process_row函式分配給模擬的datahandler,甚至將fake_process_row打入Mock,但是在我嘗試的任何同步正確的版本中,呼叫datahandler. process_row(row)繼續回傳一個Mock(),而我需要它實際呼叫我的fake_process_row函式,以便它可以回傳一個真正的行。
我看到一些解決方案,在測驗中,創建了一個真正的datahandler物件,并將fake_process_row修補到其中。我不想這樣做,因為真正的類的實體化不是完全微不足道的。只需擁有一個帶有 "作業 "方法的模擬,就像我可以擁有一個帶有 "作業 "屬性回傳值的模擬一樣,這將會容易得多。
uj5u.com熱心網友回復:
所以我找到了解決方案,它是在創建兩個獨立的Mock。
def test_create_row(self)。
# 在這里創建一個合適的row_content。
# row_content = ....
expected = {"第一列":"第一值", "第二列":"第二值"}。
datahandler = Mock()
#神奇的事情發生在這里。
method_mock = Mock(side_effect = self.fake_process_row)
datahandler.process_row = method_mock
result = create_row(row_content, datahandler)
self.assertDictEqual(expected, result)
使用side_effect有點違反直覺,但這是一旦訪問Mock()就會發生的事情。因此,當我們將datahandler.process_row設定為具有這種副作用的Mock時,當被測驗的代碼呼叫process_row方法時,它就會被觸發,而且它還很聰明地正確傳遞引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/328074.html
標籤:
