I submitted a patch for Lambda Constraint and then one for Predicate Constraint (privately) to Tim. They only execute the constraint if the passed args are of the correct type.
The predicate constraint use to throw an exception. I changed it to return false. Which makes more sense to me (and fixes my problem). If the arg type doesn't match the expected arg type, then the constraint isn't fulfilled. I don't think it's an exception. -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Stefan Steinegger Sent: 17 March 2009 17:28 To: Rhino.Mocks Subject: [RhinoMocks] Re: Order of Arg Constraints relative to actual calls Sorry to be that late, I was in holiday :-) Arg is designed to take the arguments type as generic argument. So you have to use Arg<MessageBase>. But then, you can't use the lamda for the property constraint. With the classic property constraint it works: // Arrange IServiceBus serviceBus = MockRepository.GenerateStub<IServiceBus>(); serviceBus.Stub( x => x.Send(Arg<MessageBase>.Matches( Property.Value("Value", 2) && Is.TypeOf<Message2>()))) .Return(2); serviceBus.Stub(x => x.Send(Arg<Message1>.Is.TypeOf)) .Return(1); serviceBus.Expect( x => x.Send(Arg<MessageBase>.Matches( Property.Value("Value", "Success") && Is.TypeOf<Message1>()))); ClassUnderTest cut = new ClassUnderTest(serviceBus); cut.DoMyThing(); serviceBus.VerifyAllExpectations(); AssertWasCalled also didn't work. I don't know why, probably it does not consider the constraints correctly. So there are two separate problems. - Arg<T> should implicitly constrain for TypeOf<T>, and the lamda will most probably work. - AssertWasCalled should probably consider the constraints. On 6 Mrz., 17:48, Thejuan <[email protected]> wrote: > It's not my test. It's a guy at work. I just isloated it. > Below is a method to be tested and it's test. > > The problem seems to be when using matches for args into a polymorphic > method. Rhino seems to (haven't opened the source) loop the > constraints and cast blindly into the specified type for that > constraint. > > using System; > using NUnit.Framework; > using Rhino.Mocks; > > namespace RhinoBug > { > [TestFixture] > public class Class1 > { > > [Test] > public void Bug() > { > // Arrange > IServiceBus serviceBus = > MockRepository.GenerateStub<IServiceBus>(); > > serviceBus.Stub(x => x.Send(Arg<Message2>.Matches(arg => > arg.Value == 2))).Return(2); > serviceBus.Stub(x => x.Send > (Arg<Message1>.Is.TypeOf)).Return(1); > > ClassUnderTest cut = new ClassUnderTest(serviceBus); > cut.DoMyThing(); > > serviceBus.AssertWasCalled(x => x.Send > (Arg<Message1>.Matches(arg => arg.Value == "Succes"))); > } > > } > > public class Message2 : MessageBase > { > public Message2(int value) > { > Value = value; > } > > public int Value { get; set; } > } > > public class Message1 : MessageBase > { > public string Value; > public Message1(string s) > { > Value = s; > } > } > > public interface IServiceBus > { > int Send(MessageBase msg); > } > > public class ClassUnderTest > { > private IServiceBus Bus; > > public ClassUnderTest(IServiceBus bus) > { > Bus = bus; > } > > public void DoMyThing() > { > if (Bus.Send(new Message1("Try")) == 1) > { > if (Bus.Send(new Message2(2)) == 2) > { > Bus.Send(new Message1("Success")); > } > } > } > > } > > public class MessageBase > { > } > > } > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Rhino.Mocks" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/RhinoMocks?hl=en -~----------~----~----~----~------~----~------~--~---
