犀牛模拟参数检查......有更好的方法吗?

Kor*_*fin 4 c# unit-testing rhino-mocks rhino-mocks-3.5

我正在使用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
}
Run Code Online (Sandbox Code Playgroud)

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

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 );
}
Run Code Online (Sandbox Code Playgroud)

有没有更好,更简洁,更直接的方式来测试使用Rhino Mocks?我见过使用Contraints的帖子,但我不喜欢用字符串名称识别属性/值.

Ale*_*iuk 6

您可以执行以下操作:

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

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


注意:

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

 Arg<Trade>.Matches(
   Property.Value("Delivery", new DateTime(2013, 7, 3)))
Run Code Online (Sandbox Code Playgroud)

要么:

 Arg<Trade>.Matches(
   new PredicateConstraint<DateTime>(
     t => t.Delivery.Equals(new DateTime(2013, 7, 3))))
Run Code Online (Sandbox Code Playgroud)

  • 看起来这是Rhino 3.5的一个问题.我下载了3.6并且测试通过了.这是一个[链接](http://blogs.microsoft.co.il/blogs/ndobkin/archive/2010/12/18/rhino-mocks-3-5-with-framework-4.aspx)到博客.再次感谢您的回答. (2认同)