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 模拟任意行为?

无法使用 Rhino Mocks 模拟具有数组参数的构造函数的类

Rhino Mocks 上的 mock 和 stub 有啥区别?

Rhino Mocks 默认返回类型?

Rhino Mocks 存根和模拟仅适用于接口?

如何在 Rhino Mocks 3.6 中将 Expect 设置为扩展方法