【问题标题】:Rhino Mocks - Set a property if a method is calledRhino Mocks - 如果调用方法,则设置属性
【发布时间】:2010-11-23 21:02:44
【问题描述】:

如果调用方法,Rhino Mocks 是否可以设置存根的属性。

类似这样的:(粗体为假代码)

callMonitor.Expect(x=>x.HangUp()).SetProperty(callMonitor.InACall = false);

HangUp 方法返回 void,我无法真正改变它。但我希望我的存根知道在调用 HangUp 时通话已挂断。

【问题讨论】:

    标签: c# unit-testing rhino-mocks


    【解决方案1】:

    当调用存根时,您可以使用“WhenCalled”方法运行您自己的代码;很确定它也应该与 Mocks 一起使用。根据文档,WhenCalled 是 Callback 的替换/升级。

    callMonitor.Expect(x => x.HangUp())
    .WhenCalled(invocation => callMonitor.InCall = false);
    

    本文末尾的一些信息: http://grahamnash.blogspot.com/2008/10/rhino-mocks-35.html

    【讨论】:

    • 仍然是滥用,即使方法名称已更改。 WhenCalled 与 Callback 一样,旨在用于高级期望评估,而不是进行任意计算。
    • 你会推荐什么?手卷测试替身?
    • 其实我想看看测试。在我看来,如果测试足够集中,可能就没有必要了。
    • 看测试看这个问题:stackoverflow.com/questions/1349324/…如果有“正道”那我想知道。
    • tvanfosson:我在少数情况下使用它来设置测试中的局部变量,但通常不会像本例那样在模拟/存根上设置属性。到目前为止,它还没有给我带来任何问题,但我想了解为什么这被认为是滥用行为? Rhino Mocks 是否有某种形式的规范文档,上面写着“您不得滥用WhenCalled”? (严肃的问题!我发现 Rhino Mocks 文档有点快和松散+散落在各处)。干杯。
    【解决方案2】:

    在某些情况下您可能需要执行此操作,但通常我希望您只需检测您的模拟/存根,以便它返回正确的值以响应您的代码。我能想到的唯一例外是部分模拟,您正在测试类的一部分并希望模拟其他部分。

    在属性上设置模拟非常简单。

    callMonitor.Expect( x => x.HangUp() );
    callMonitor.Expect( x => x.InACall ).Return( false );
    

    如果callMonitor是stub,那么可以直接设置属性。

    callMonitor.Stub( x => x.HangUp() );
    callMonitor.InACall = false;
    

    【讨论】:

      【解决方案3】:

      我不是 RhinoMocks 专家,但我相信这应该可行。

      SetupResult.For(callMonitor.InACall).Return(false);
      

      【讨论】:

      • 我相信他问的不是这个。他询问是否有办法给 HangUp 方法一个即兴实现,在调用 HangUp 方法时将 InCall 属性设置为 false。无论是否调用了 HangUp 方法,您所拥有的都会导致 InACall 方法返回 false。
      【解决方案4】:

      是的,你可以使用回调方法:

       callMonitor.Expect(x => x.HangUp()).Callback(() => callMonitor.InCall = false);
      

      【讨论】:

      • 正是我会写的(如果我在 6 分钟前遇到这个问题;)
      • 严重滥用回调机制。很难说,因为帖子中没有太多信息,但我认为 OP 在测试中的注意力不够集中。阅读 Ayende 关于使用回调的注意事项ayende.com/Wiki/(S(zwkmge45vdgkgvznp13mgc55))/…
      • FWIW -- 回调应该用于评估是否满足期望,而不是进行任意计算。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      相关资源
      最近更新 更多