Rhino Mock Parameter Inspection ... Is There a Better Way?
c#, rhino-mocks, rhino-mocks-3.5, unit-testing
Solution
You can do the following:
Expect.Call(() => m_Service.UpdateTrade(
Arg<Trade>.Matches(t => t.Delivery.Equals(new DateTime(2013, 7, 3))),
Arg<Token>.Is.Anything)
);
Please also note, if you are not going to validate `token` parameter in this tests, then you can use `Is.Anything` constraint for it.
Note:
RhinoMocks 3.5 and .NET4+ throw an AmbiguousMatchException when using the `Matches(Expression<Predicate<..>>)` overload. If it is not possible to update to RhinoMocks 3.6 (there are reasons), one can still use the `Matches(AbstractConstraint)` overload as so:
Arg<Trade>.Matches(
Property.Value("Delivery", new DateTime(2013, 7, 3)))
or:
Arg<Trade>.Matches(
new PredicateConstraint<DateTime>(
t => t.Delivery.Equals(new DateTime(2013, 7, 3))))
Problem
I'm using Rhino Mocks 3.5 to mock a service method call which takes 2 parameters and I want to make sure a propery on an object is being set correctly. ``` // Method being tested void UpdateDelivery( Trade trade ) { trade.Delivery = new DateTime( 2013, 7, 4 ); m_Service.UpdateTrade( trade, m_Token ); // mocking this } ``` Here's a portion of my code (which works) ``` 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 ); } ``` Is there a better, more concise, straightfoward way to test this using Rhino Mocks? I've seen posts where Contraints are used but I'm not a fan of identifying properties / value by string names.