Rhino Mocks - 使用 ref/out 参数模拟集合
Posted
技术标签:
【中文标题】Rhino Mocks - 使用 ref/out 参数模拟集合【英文标题】:Rhino Mocks - Mocking collection with ref/out arguments 【发布时间】:2012-01-24 09:01:21 【问题描述】:我仍在学习 Rhino 模拟,并对此有疑问。例如 - 我在模拟界面中有一个函数:
public interface ISomeObject
string Name get; set;
int Id get;set;
// This class will be returned as and answer to function call
public class AnswerObject
public bool IfError get;set;
// Main interface
public interface IClass
AnswerObject FunctionGetCollection(ref ICollection <ISomeObject> ListOfInternalObjects, ref int Number);
如您所见,函数“FunctionGetCollection”将接收作为“ref”传递的 2 个参数并返回另一个类作为“function-answer”。你能帮我存根这个函数吗?我需要能够使用:
函数将返回不同的集合(基于代码而不是参数) 函数将返回不同的 AnswerObject【问题讨论】:
【参考方案1】:语法不是很好。用的不是很频繁,用的是老式的Rhino.Mocks.Constraints
。
这段代码设置了一个模拟,将所有引用参数替换为新值。
AnswerObject answerObject;
ICollection <ISomeObject> collection;
int number;
IClass iClassMock = MockRepository.GenerateMock<IClass>();
iClassMock
.Stub(x => x.FunctionGetCollection(
ref Arg<ICollection <ISomeObject>>.Ref(Is.Anything(), collection).Dummy,
ref Arg<int>.Ref(Is.Anything(), number).Dummy);
.Return(answerObject);
如果您想保留传递给模拟的值,则需要在 WhenCalled 块中实现这一点:
iClassMock
.Stub(x => x.FunctionGetCollection(
ref Arg<ICollection <ISomeObject>>.Ref(Is.Anything(), null).Dummy,
ref Arg<int>.Ref(Is.Anything(), 0).Dummy);
.WhennCalled(call =>
// reset the ref arguments to what had been passed to the mock
// not sure if it also works with the int
call.Arguments[0] = call.Arguments[0];
call.Arguments[1] = call.Arguments[1];
)
.Return(answerObject);
【讨论】:
Is.Anything - 给出错误:参数 1:无法从 'method group' 转换为 'Rhino.Mocks.Constraints.AbstractConstraint' (我还在 Arg 参数之前添加了 'ref' 作为功能要求) :( :( 这是正确的答案 - 在两个地方都使用 Is.Anything() 并在 'Arg' 之前添加 'ref' 并且它有效!反正我很接近 :) :)以上是关于Rhino Mocks - 使用 ref/out 参数模拟集合的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Rhino Mocks 模拟具有数组参数的构造函数的类