如何在 Rhino Mocks 中模拟 ReadOnlyCollection
本文关键字:ReadOnlyCollection 模拟 Rhino Mocks | 更新日期: 2023-09-27 18:33:11
我在单元测试中使用了 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,但我不知道这在犀牛模拟中的等价物是什么。(类确实有一个无参数构造函数)如何为只读集合创建存根/模拟?
您可以将任何构造函数参数传递给GenerateMock
:
var inner = new List<UserDetails>();
var userDetails = MockRepository.GenerateMock<ReadOnlyCollection<UserDetails>>(inner);
您可能需要考虑在测试中创建ReadOnlyCollection
实例,并从其他方法调用返回它,这比模拟适当的方法要简单得多。
不确定你能用 Rhino Mock 做到这一点。问题是 ReadOnlyCollection 不是一个接口,也不包含开源模拟框架可以使用的虚拟方法。
由于ReadOnlyCollection
实现了IList
因此您可以尝试此SO问题中建议的方法
如何使用最小起订量模拟私有只读 IList
基本上将 IList 集合用作公共属性,但将基础列表设为私有,以便您仍然可以获得只读体验。因此,在测试中,您可以使用:
var userDetails = MockRepository.GenerateMock<IList<UserDetails>>();
如果你真的想模拟一个ReadOnlyCollection,你需要购买TypeMock或JustMock。或者,获取Visual Studio 2012 Premium with Update 2,您可以在其中使用MS Fakes模拟框架。
编辑:李的回答比我的:)效率高得多我会建议那个。