4

我正在使用 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 的帖子,但我不喜欢通过字符串名称来识别属性/值。

4

1 回答 1

6

您可以执行以下操作:

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<Predicate<..>>)重载时会抛出 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))))
于 2013-07-11T05:15:00.837 回答