簡體   English   中英

如何模擬ReadOnlyCollection <T> 在犀牛Mo?

[英]How to mock ReadOnlyCollection<T> in Rhino Mocks?

我在單元測試中使用了Rhino模擬,並且嘗試使用以下代碼創建模擬:

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()方法進行的,但我不知道在犀牛模擬中這相當於什么。 (UserDetails類確實具有無參數的構造函數)如何為ReadOnlyCollection創建存根/模擬?

您可以將任何構造函數參數傳遞給GenerateMock

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

您可能要考慮在測試中創建ReadOnlyCollection的實例,並從其他方法調用中返回它,這比模擬適當的方法要簡單得多。

不確定您可以使用Rhino Mock做到這一點。 問題在於ReadOnlyCollection不是接口,也不包含開放源代碼模擬框架可以使用的虛擬方法。

由於ReadOnlyCollection實現了IList您可以嘗試在此SO問題中找到的建議方法

如何使用Moq模擬私有只讀IList <T>屬性

基本上將IList集合用作公共屬性,但是將基礎列表設為私有,因此您仍會獲得只讀體驗。 因此,在測試中,您可以使用:

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

如果您真的想模擬ReadOnlyCollection,則需要購買TypeMock或JustMock。 或者,獲取帶有Update 2的Visual Studio 2012 Premium,您可以在其中使用MS Fakes模擬框架。

編輯:李的答案比我的有效得多:)我建議改用一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM