RhinoMocks - 存根返回参数的方法

Posted

技术标签:

【中文标题】RhinoMocks - 存根返回参数的方法【英文标题】:RhinoMocks - Stub a Method That Returns a Parameter 【发布时间】:2010-12-15 22:11:56 【问题描述】:

我正在使用 RhinoMocks,我需要存根一个方法,并且总是让它返回第三个参数,无论传入什么:

_service.Stub(x => x.Method(parm1, parm2, parm3)).Return(parm3);

显然,这并不容易。我并不总是知道参数会是什么,但我知道我总是想返回第三个。

【问题讨论】:

我不确定这是否可能。你能发布你正在尝试测试的方法吗? 该方法从静态类返回对另一个方法的调用。基本上,调用会在数据库中查看第一个参数是否存在,如果不存在,则返回第三个参数。 起订量小菜一碟 【参考方案1】:

您可以使用Do() handler 提供方法的实现:

Func<TypeX,TypeY,TypeZ,TypeZ> returnThird = (x,y,z) => z;
mock.Expect(x => x.Method(null, null, null)).IgnoreArguments().Do(returnThird);

注意TypeZ 出现了两次,因为它既是输入参数类型又是返回类型。

【讨论】:

这是使用.Expect() 而不是问题中的.Stub()【参考方案2】:

这对我有用:

        _service
            .Stub(x => x.Method(Arg<string>.Is.Anything, ... ))
            .Return(null) // ... or default(T): will be ignored but RhinoMock requires it
            .WhenCalled(x =>
            
                // This will be used as the return value
                x.ReturnValue = (string) x.Arguments[0];
            );

【讨论】:

【参考方案3】:

您可以使用带有回调的 expect 方法来返回您所追求的值。以下将返回 null。

_service.Expect(o => o.Method(null, null, null))
        .Callback((object parm1, object parm2, object parm3) =>  return parm3; );

我不确定你是否可以在存根上使用回调。

【讨论】:

我试过这个,但回调委托希望我返回一个布尔值而不是一个对象。如何根据参数返回对象。这实际上是我想要做的:_mockFactory.Stub(_ =&gt; _.Create(null, null, null)).IgnoreArguments().Callback((object a1, object a2, object a3) =&gt; MockRepository.GeneratePartialMock&lt;MyObject&gt;(a1, a2, a3)); 但我收到错误“无法将类型 MyObject 转换为 bool”。有什么建议吗?

以上是关于RhinoMocks - 存根返回参数的方法的主要内容,如果未能解决你的问题,请参考以下文章

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

Simulink 代码生成:来自 Function Caller 模块的函数存根及其返回值/参数

类的带参方法

类的有参方法

Java 中带参带返回值方法的使用

如何在 SinonJS 中对模拟方法的返回值进行存根