如何在Rhino Mocks中模拟ReadOnlyCollection <t>?</t>

时间:2013-09-29 18:24:49

标签: c# unit-testing rhino-mocks

我在单元测试中使用rhino mock,我正在尝试使用以下代码创建模拟:

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创建存根/模拟?

2 个答案:

答案 0 :(得分:2)

您可以将任何构造函数参数传递给GenerateMock

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

您可能需要考虑在测试中创建ReadOnlyCollection的实例,并从其他方法调用中返回它,这比模拟相应的方法要简单得多。

答案 1 :(得分:1)

不确定你能用Rhino Mock做到这一点。问题是ReadOnlyCollection不是一个接口,也不包含虚拟方法,开源模拟框架可以使用这些方法。

由于ReadOnlyCollection实现IList,您可以尝试在此SO问题中找到的建议方法

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模拟框架。

编辑: 李的答案比我的答案要高得多:)我建议改为一个。