C# 如何模拟只读集合<;T>;模仿犀牛?

C# 如何模拟只读集合<;T>;模仿犀牛?,c#,unit-testing,rhino-mocks,C#,Unit Testing,Rhino Mocks,我在单元测试中使用rhino mock,并尝试使用以下代码创建一个mock: var userDetails = MockRepository.GenerateMock<ReadOnlyCollection<UserDetails>>(); 我在网上搜索并找到了类似的问题和解决方案,其中一个是使用SetupGet()方法针对moq的问题和解决方案,但我不知道在rhino Mock中有什么等效的问题和解决方案。(UserDetails类确实有一个无参数构造函数)如何为Re

我在单元测试中使用rhino mock,并尝试使用以下代码创建一个mock:

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

我在网上搜索并找到了类似的问题和解决方案,其中一个是使用SetupGet()方法针对moq的问题和解决方案,但我不知道在rhino Mock中有什么等效的问题和解决方案。(UserDetails类确实有一个无参数构造函数)如何为ReadOnlyCollection创建存根/模拟?

不确定您是否可以使用Rhino mock实现这一点。问题在于ReadOnlyCollection不是接口,也不包含虚拟方法,开源模拟框架可以使用这些方法

因为implements
IList
,所以您可以尝试在这个问题中找到的建议方法

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

var userDetails=MockRepository.GenerateMock()

如果您确实想模拟ReadOnlyCollection,则需要购买TypeMock或JustMock。或者,使用更新2获得Visual Studio 2012 Premium,您可以使用MS Fakes模拟框架

编辑:
Lee的答案比我的要有效得多:)我建议换一个。

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

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

您可能想考虑在测试中创建一个RealDyLyCys<代码>的实例,并从其他方法调用中返回它,这将比嘲笑适当的方法要简单得多。

您为什么需要模拟它呢?我想我应该创建一个实例,并根据需要进行设置。mock没有太大的优势。它已经通过了最初的错误,但是现在当我尝试使用它做任何事情时,我得到了“无效调用,最后一个调用已经被使用,或者没有调用(确保您正在调用一个虚拟(C#)/可重写(VB)方法)。”-我应该将调用的方法设置为虚拟以便rhino mocks可以使用它吗?我刚刚意识到这是一个静态类,所以我不能lol@Theomax-看不到代码很难判断,但是看一下
ReadOnlyCollection
,大多数方法都是非虚拟的,因此不能使用rhino mock来模拟它们。如果您使用的是.NET4.5,您可以使用
IReadonlyCollection
,但是我会在测试中构造您需要的任何测试数据,而不是试图模拟框架类。
var inner = new List<UserDetails>();
var userDetails = MockRepository.GenerateMock<ReadOnlyCollection<UserDetails>>(inner);