2013-09-25 18 views
3

我有一個IEnumerable<T>集合,我想模擬First<T>()方法調用。 當我試圖這樣做,我得到這個:如何使用Rhino mock模擬IEnumerable.First <T>()方法?

上一個方法'IEnumerator.MoveNext();'需要返回值或拋出異常。

我粘貼下面的代碼:

IEnumerable<T> collection = MockRepository 
    .GenerateStub<IEnumerable<T>>(); 
collection 
    .Stub(x => x.First<T>()) 
    .IgnoreArguments() 
    .Return(MockRepository.GenerateStub<T>()); 

x.First<T>拋出上述異常。我如何解決它?我試圖通過嘲笑GetEnumerator()方法調用返回IEnumerator。它也沒有幫助。

回答

5

我打算假設T存在,因爲代碼是通用函數。

由於這是一種靜態擴展方法,因此不能存檔對First<T>()的調用。它沒有在IEnumerable<T>中定義,它是Enumerable的成員。

所以,你需要在你的IEnumerable<T>短截線Stub GetEnumerator()返回一個IEnumerator<T>存根,它返回你想要的那種類型的存根:

IEnumerator<T> enumerator = MockRepository.GenerateStub<IEnumerator<T>>(); 
enumerator.Stub(x => x.MoveNext()).Return(true); 
enumerator.Stub(x => x.Current).Return(MockRepository.GenerateStub<T>()); 
enumerator.Stub(x => x.MoveNext()).Return(false); 

IEnumerable<T> collection = MockRepository.GenerateStub<IEnumerable<T>>(); 
collection.Stub(x => x.GetEnumerator()).Return(enumerator); 

不過,我想強烈建議不要嘗試嘲笑IEnumerable。使用List<>在一個單一產品最初的代碼更容易,以後要閱讀,而且更脆:

List<T> listOfT = new List<T> 
{ 
    MockRepository.GenerateStub<T>() 
}; 

這是一個非常糟糕的主意存根/模擬採集接口類型 - 使用界面,所有意思是說,但是在你的測試中用一個實際的集合來支持它。

+0

一個簡潔的答案。啊,我知道我們不能嘲笑靜態功能。但是這從來沒有打動過我。那麼,我真的希望我可以採取你的建議,不要模擬IEnumerable接口。但是,編寫單元測試用例的代碼的寫法迫使我這樣做。謝謝你的答案克里斯。 – Anee

相關問題