2012-10-21 29 views
1

有傳入我的類IEnumerable<IDomainInterface>,我想測試特定的方法是否要求每一個項目:如何測試延期執行?

// in class 
var result = _items.SelectMany (x => x.Get (something)); 

// in test 
domainInterfaceMock.Expect(x => x.Get (something)); 

測試只有當我追加ToArray()SelectMany()語句將...

我應該如何處理這種情況?

回答

1

這是因爲僅當LINQ表達式被計算(即迭代)時才調用Get()。如果你在你的類方法調用get(),它必須做的東西不僅僅是

var result = _items.SelectMany (x => x.Get (something)); 

...因爲這本身不會導致任何調用以獲得更多的()。您應該修改測試以反映這一點。

更新: 你正在測試的方法,所以你應該嘲笑了輸入方法,並通過他們的實際方法,並測試這些輸入和結果的期望。如果方法評估LINQ表達式本身,那麼你會發現它調用了Get(),但是如果它不評估LINQ表達式本身,你可以通過使用.ToArray()強制執行評估來做正確的事情。

更準確地說,通過調用.ToArray(),您試圖演示方法的返回值是您的預期,但要直接執行此操作,您必須分析返回的表達式。如果你想證明的唯一事實是表達式爲其所有成員調用Get(),那麼你在做什麼來實現這一點。

+0

也許我還不夠清楚^^我知道原因,但我不知道應該如何修改我的測試。我是否必須一直追蹤到下一個語句,其中'result'用作參數? – Matthias

+0

我已添加更新。希望這可以幫助!總之,你並沒有真正的單元測試語句,你可以單元測試整個方法。如上所述,您的單元測試是對.SelectMany的單元測試,我將留給微軟擔心。 –

0

如果x是可嘲弄的(即,它是一個接口或抽象類),那麼您可以驗證對於每個您創建Get()方法的模擬實例。