2013-09-29 58 views
2

我用我的單元測試犀牛嘲笑,我嘗試使用下面的代碼來創建一個模擬:如何在Rhino Mocks中模擬ReadOnlyCollection <T>?

var userDetails = MockRepository.GenerateMock<ReadOnlyCollection<UserDetails>>(); 

但是當我運行單元測試,我得到以下錯誤:

Can not instantiate proxy of class: 
System.Collections.ObjectModel.ReadOnlyCollection` 
1[[SolutionName.FolderName,]]. 
Could not find a parameterless constructor. 

我在網上搜索過,發現類似的問題和解決方案,一個用於使用SetupGet()方法的moq,但我不知道這在犀牛模擬中是什麼。 (UserDetails類沒有無參數構造函數)如何爲ReadOnlyCollection創建存根/模擬?

+3

爲什麼你需要嘲笑它?我想我會創建一個實例並根據需要進行設置。用模擬器看不到太多。 –

回答

2

你可以傳遞任何構造函數參數GenerateMock

var inner = new List<UserDetails>(); 
var userDetails = MockRepository.GenerateMock<ReadOnlyCollection<UserDetails>>(inner); 

你可能要考慮在您的測試創造ReadOnlyCollection一個實例和一些其他的方法調用,這將是比嘲諷更簡單的返回它適當的方法。

+0

+1啊,當然:)簡單。 –

+0

它通過了原來的錯誤,但現在當我嘗試做任何事情,我得到'無效呼叫,最後一次調用已被使用或沒有調用(確保你正在調用虛擬(C#)/ Overridable (VB)方法)。' - 我應該讓我打電話給虛擬的方法,讓犀牛嘲笑可以使用它嗎?我剛剛意識到這是一個靜態類,所以我不能大聲笑 – Theomax

+0

@Theomax - 很難說沒有看到代碼,但看着'ReadOnlyCollection',大多數方法都是非虛擬的,所以你不能模擬他們使用犀牛嘲笑。如果你使用.Net 4.5,你可以使用'IReadonlyCollection',但是我會在你的測試中構建你需要的任何測試數據,而不是試圖模擬框架類。 – Lee

1

不知道你可以用Rhino Mock做到這一點。問題是ReadOnlyCollection不是一個接口,也不包含虛擬方法,而開放源代碼模擬框架可以使用這些方法。

由於ReadOnlyCollection工具IList你可以嘗試在此發現暗示方法,從而質疑

How to mock a private readonly IList<T> property using moq

基本上使用一個IList集合作爲一個公共屬性,但使基礎列表私有的,所以,你仍然能只讀體驗。因此,在您的測試,你可以使用:

var userDetails = MockRepository.GenerateMock<IList<UserDetails>>();

如果你真的嘲笑一個ReadOnlyCollection,該你將需要購買或者TypeMock或JustMock。或者,使用Update 2獲取Visual Studio 2012 Premium,您可以在其中使用MS Fakes mocking框架。

編輯: 李的答案是更有效的,然後我的:)我會建議,而不是。