我正在使用 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 进行测试?我看过使用约束的帖子,但我不喜欢通过字符串名称识别属性/值。
最佳答案
您可以执行以下操作:
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))))
关于c# - Rhino Mock 参数检查...有更好的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17533707/