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

4

我正在使用Rhino Mocks 3.5来模拟一个需要传入两个参数的服务方法调用,并且我想要确保对象上的一个属性被正确地设置。

// 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,但我不喜欢通过字符串名称来识别属性/值。
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 约束条件。
备注:
当使用Matches(Expression<Predicate<..>>)重载时,RhinoMocks 3.5和.NET4+会抛出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))))

1
谢谢Alexander。这正是我在寻找的。但是当我运行时,我收到了“System.Reflection.AmbiguousMatchException:发现模糊匹配”的错误。我正在使用.Net 4.0。 - KornMuffin
你是针对哪个方法得到这个异常的? - Alexander Stepaniuk
在被测试的类中调用m_Service.UpdateTrade方法时,Rhino Mocks引发了异常。System.Reflection.AmbiguousMatchException:找到了模糊匹配项。 at System.RuntimeType.GetMethodImpl(String name, BindingFlags bindingAttr, Binder binder, CallingConventions callConv, Type[] types, ParameterModifier[] modifiers) at System.Type.GetMethod(String name) at Rhino.Mocks.Constraints.LambdaConstraint.Eval(Object obj) at Rhino.Mocks.Expectations.ConstraintsExpectation.DoIsExpected(Object[] args) at Rhino.Mocks.Expectations.AbstractExpectation.IsExpected(Object[] args)... - KornMuffin
1
方法 UpdateTrade() 有没有重载?您能添加包含方法 UpdateTrade() 的接口/类的定义吗? - Alexander Stepaniuk
2
看起来这是Rhino 3.5的问题。我下载了3.6版本,测试通过了。这里有一个博客链接。再次感谢您的回答。 - KornMuffin
1
@KornMuffin(以及像我这样“必须”使用Rhino 3.5的人),“找到模糊匹配”仅在使用Matches的Expression重载时引起。接受AbstractConstraint的重载按预期工作。 - user2864740

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接