【问题标题】:Rhino Mock Parameter Inspection ... Is There a Better Way?Rhino Mock 参数检查...有更好的方法吗?
【发布时间】:2013-07-08 18:39:59
【问题描述】:

我正在使用 Rhino Mocks 3.5 模拟一个需要 2 个参数的服务方法调用,我想确保对象的属性设置正确。

// Method being tested
void UpdateDelivery( Trade trade )
{
    trade.Delivery = new DateTime( 2013, 7, 4 );
    m_Service.UpdateTrade( trade, m_Token ); // mocking this
}

这是我的代码的一部分(有效)

service, trade, token declared / new'd up ... etc.
...

using ( m_Mocks.Record() )
{
    Action<Trade, Token> onCalled = ( tradeParam, tokenParam ) =>
            {
                // Inspect / verify that Delivery prop is set correctly
                // when UpdateTrade called
                Assert.AreEqual( new DateTime( 2013, 7, 4 ), tradeParam.Delivery );                     
            };

    Expect.Call( () => m_Service.UpdateTrade( Arg<Trade>.Is.Equal( trade ), Arg<Token>.Is.Equal( token ) ) ).Do( onCalled );
}

using ( m_Mocks.Playback() )
{
    m_Adjuster = new Adjuster( service, token );
    m_Adjuster.UpdateDelivery( trade );
}

有没有更好、更简洁、更直接的方法来使用 Rhino Mocks 进行测试?我看过使用了 Contraints 的帖子,但我不喜欢通过字符串名称来识别属性/值。

【问题讨论】:

    标签: c# unit-testing rhino-mocks rhino-mocks-3.5


    【解决方案1】:

    您可以执行以下操作:

    Expect.Call(() => m_Service.UpdateTrade(
        Arg<Trade>.Matches(t => t.Delivery.Equals(new DateTime(2013, 7, 3))),
        Arg<Token>.Is.Anything)
    );
    

    还请注意,如果您不打算在此测试中验证token 参数,那么您可以使用Is.Anything 约束。


    注意:

    RhinoMocks 3.5 和 .NET4+ 在使用 Matches(Expression&lt;Predicate&lt;..&gt;&gt;) 重载时会抛出 AmbiguousMatchException。如果无法更新到 RhinoMocks 3.6(有原因),仍然可以使用 Matches(AbstractConstraint) 重载:

     Arg<Trade>.Matches(
       Property.Value("Delivery", new DateTime(2013, 7, 3)))
    

    或:

     Arg<Trade>.Matches(
       new PredicateConstraint<DateTime>(
         t => t.Delivery.Equals(new DateTime(2013, 7, 3))))
    

    【讨论】:

    • 谢谢亚历山大。这正是我一直在寻找的。我收到“System.Reflection.AmbiguousMatchException:找到不明确的匹配”。当我跑步时。我正在使用 .Net 4.0
    • 你用什么方法得到这个异常?
    • 方法UpdateTrade() 有重载吗?你能添加包含方法UpdateTrade()的接口/类的定义吗?
    • 看起来这是 Rhino 3.5 的问题。我下载了 3.6 并且测试通过了。这是博客的link。再次感谢您的回答。
    • @KornMuffin (以及像我这样“必须”使用 Rhino 3.5 的人)“发现歧义匹配”仅在使用匹配的表达式重载时引起。 AbstractConstraint 中的重载按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2011-11-20
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多