我們有一個相當複雜的接口層次結構,我努力讓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());
您是否發現過關於此的其他信息?我遇到了同樣的問題,試圖找出解決方法。 – poindexter12 2011-10-03 22:30:10
@ poindexter12 - 我從來沒有設法解決這個問題,但是我們後來發現Moq會緩存第一次調用模擬GetEnumerator()時得到的枚舉器。這意味着後續調用將返回相同的枚舉數,這可能是爲什麼我在後續調用中獲得不同的行爲。爲了解決這個問題,你可以模擬GetEnumerator()來返回一個創建一個新的Enumerator的匿名方法,而不是像上面的示例代碼那樣直接調用GetEnumerator()的具體實現。祝你好運! – Coxy 2011-10-04 00:25:27