2

我在我的单元测试中使用 rhino mock,我正在尝试使用以下代码创建一个 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() 方法的起订量,但我不知道犀牛模拟中的等价物是什么。(UserDetails 类确实有一个无参数构造函数)如何为 ReadOnlyCollection 创建存根/模拟?

4

2 回答 2

2

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

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

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

于 2013-09-29T18:47:16.273 回答
1

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

由于ReadOnlyCollection实现IList了您可以尝试在这个 SO question 中找到的建议方法

如何使用 moq 模拟私有只读 IList<T> 属性

基本上将 IList 集合用作公共属性,但将基础列表设为私有,因此您仍然可以获得只读体验。因此,在您的测试中,您可以使用:

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

如果你真的想模拟 ReadOnlyCollection,你需要购买 TypeMock 或 JustMock。或者,获取带有 Update 2 的 Visual Studio 2012 Premium,您可以在其中使用 MS Fakes 模拟框架。

编辑:李的回答比我的要有效得多:) 我建议改用那个。

于 2013-09-29T18:37:40.020 回答