2011-05-11 55 views
4

我們有一個相當複雜的接口層次結構,我努力讓Moq做我想做的事情。Moq - 無法遍歷隱藏的IEnumerable

我有一個接口IReservation,它延伸IRulesReservation,並隱藏其枚舉器與另一種類型的新實現。

public interface IReservation : IRulesReservation 
{ 
    new IEnumerator<IRoutePart> GetEnumerator(); 
} 

IRulesReservation延伸IEnumerable

public interface IRulesReservation : IEnumerable<IRulesRoutePart> 
{ 
} 

我想要測試的方法需要在IReservation,但在不同的點需要訪問IEnumerable<IRulesRoutePart>。我的模擬是建立像這樣:

m_mock = new Mock<IReservation>(); 
m_mock.As<IRulesReservation>().Setup(r => r.GetEnumerator()).Returns(routeParts.Select(rp => (IRulesRoutePart)rp).GetEnumerator()); 

在這個例子中,routeParts是來自Mock<IRouteParts>對象都設置有.As<IRulesRoutePart>()IRouteParts列表。

每當我在函數中得到一點代碼時,我會使用枚舉器進行測試,它將遍歷迭代,就像集合是空的一樣。

我在做什麼錯誤的設置?或者,Moq無法處理以這種方式隱藏的統計員?


編輯:一些奇怪的行爲在模擬運行測試代碼時,我剛剛注意到:

Assert.That((reservation.Object as IRulesReservation).Count() == 8); 
Assert.That((reservation.Object as IEnumerable<IRulesRoutePart>).Count() == 8); 

第一行會通過,但第二線將失敗。 我試圖改變模擬專門設置一個枚舉的IEnumerable<IRulesRoutePart>,但沒有效果:

m_mock.As<IEnumerable<IRulesRoutePart>>().Setup(r => r.GetEnumerator()).Returns(routeParts.Select(rp => (IRulesRoutePart)rp).GetEnumerator()); 
+0

您是否發現過關於此的其他信息?我遇到了同樣的問題,試圖找出解決方法。 – poindexter12 2011-10-03 22:30:10

+0

@ poindexter12 - 我從來沒有設法解決這個問題,但是我們後來發現Moq會緩存第一次調用模擬GetEnumerator()時得到的枚舉器。這意味着後續調用將返回相同的枚舉數,這可能是爲什麼我在後續調用中獲得不同的行爲。爲了解決這個問題,你可以模擬GetEnumerator()來返回一個創建一個新的Enumerator的匿名方法,而不是像上面的示例代碼那樣直接調用GetEnumerator()的具體實現。祝你好運! – Coxy 2011-10-04 00:25:27

回答

1

請問您設置的回報實際上有數據的對象?這可能是你的問題。

+0

它確實是這樣的,在這個例子中,routeParts是一個來自模擬的IRouteParts的列表,它也被設置爲()。 – Coxy 2011-05-11 04:37:13

+0

某處必須填充要由您的設置返回的數據。你在哪裏用假數據創建一個irouteparts的填充列表? – mluker 2011-05-11 04:45:13

+0

不確定它是如何相關的,但IRouteParts的列表事先已創建,並保存在該示例中名爲routeParts的變量中。 – Coxy 2011-05-11 05:01:41