我在单元测试中使用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创建存根/模拟?
答案 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模拟框架。
编辑: 李的答案比我的答案要高得多:)我建议改为一个。