Ah, I see now! Thank you so much. I understand that using the AAA syntax is considered superior... I've done it for 99.9% of my tests. I just wasn't aware that there was an AAA (more or less) way to do ordered mocks.
Thanks again for your assistance. -- Jason On Sep 13, 2:52 pm, Tim Barcz <[email protected]> wrote: > Also, please note that my example is not ordered. To make my example worked > for ordered semantic see the following (note the moving of the expectation > setting - which would also work for the previous example) and the line * > mockOrderedThing.GetMockRepository().Ordered()* which changes the underlying > recorder from unordered to ordered: > > [TestMethod] > public void TestThingsAreRunInOrderAAA() > { > // Arrange > IOrderedThing mockOrderedThing = > MockRepository.GenerateMock<IOrderedThing>(); > MyTestClass classUnderTest = new MyTestClass(mockOrderedThing); > mockOrderedThing.GetMockRepository().Ordered(); > > mockOrderedThing.Expect(thing => thing.FirstThing()); > mockOrderedThing.Expect(thing => thing.SecondThing()); > > // Act > classUnderTest.DoThingsInOrder(); > > mockOrderedThing.VerifyAllExpectations(); > > > > > > } > On Mon, Sep 13, 2010 at 1:46 PM, Tim Barcz <[email protected]> wrote: > > By the way...let me know if this explains it or if you (or anyone) need > > anymore assistance, I'd be glad to help. > > > On Mon, Sep 13, 2010 at 1:45 PM, Tim Barcz <[email protected]> wrote: > > >> Jason, > > >> The problem doesn't exist with the event at all, the problem is with the > >> larger test, using the record/replay semantics. What's happening is that > >> behind the scenes is that there are a total of four expectations being set > >> - > >> the constructor sets two (one on OnThingHappened and one on > >> SomethingElse()). The other two expectations are set explicitly by you > >> when > >> you call mockOrderedThing.Expect...twice for FirstThing() and > >> SecondThing(). > >> Once in replay mode, you call DoThingsInOrder which calls SomethingElse(), > >> FirstThing(), SecondThing(), thus satisfying three of the four > >> expectations. > >> The only unsatisfied expectation is the event - which as you've found is > >> never called. > > >> Commenting out the call in the constructor removes the expectation - which > >> is why it passes. > > >> To further illustrate that it's not the event, comment out the call in to > >> SomethingElse() in DoThingsInOrder(), you'll find the test fails. > > >> What's really going on here is a problem with record/replay. Anything > >> that is called in record play is expected to be called later on, which the > >> event is never triggered. To get what you're going for I would suggest > >> changing the code to AAA syntax (a good suggestion in general) to the > >> following: > > >> [TestMethod] > >> public void TestThingsAreRunInOrderAAA() > >> { > >> // Arrange > >> IOrderedThing mockOrderedThing = > >> MockRepository.GenerateMock<IOrderedThing>(); > >> MyTestClass classUnderTest = new MyTestClass(mockOrderedThing); > > >> // Act > >> classUnderTest.DoThingsInOrder(); > > >> // Assert > >> mockOrderedThing.AssertWasCalled(thing => thing.FirstThing()); > >> mockOrderedThing.AssertWasCalled(thing => thing.SecondThing()); > >> } > > >> On Mon, Sep 13, 2010 at 9:47 AM, Jason Specland <[email protected]>wrote: > > >>> Hey there, > > >>> I'm having an problem when I try to wire up an event in one of my > >>> classes inside the constructor whenever the "event" is part of my mock > >>> object, and the tests I'm running are ordered. It's easier to show > >>> than to explain, so here's some sample code: > > >>> My sample class under test: > > >>> namespace RhinoMocksOrdredWithEvents { > > >>> public interface IOrderedThing { > >>> void FirstThing(); > >>> void SecondThing(); > >>> void SomethingElse(); > >>> event EventHandler<EventArgs> OnThingHappened; > >>> } > > >>> public class MyTestClass { > > >>> private IOrderedThing MyOrderedThing { get; set; } > > >>> public MyTestClass(IOrderedThing orderedThing) { > >>> MyOrderedThing = orderedThing; > >>> MyOrderedThing.OnThingHappened += new > >>> EventHandler<EventArgs>(MyOrderedThing_OnThingHappened); > >>> MyOrderedThing.SomethingElse(); > >>> } > > >>> public void DoThingsInOrder() { > > >>> MyOrderedThing.SomethingElse(); > > >>> MyOrderedThing.FirstThing(); > >>> MyOrderedThing.SecondThing(); > >>> } > > >>> private void MyOrderedThing_OnThingHappened(object sender, > >>> EventArgs e) { > >>> return; > >>> } > > >>> } > >>> } > > >>> And my sample test: > > >>> namespace RhinoMocksOrdredWithEvents { > >>> [TestClass] > >>> public class OrderedMockTests { > > >>> [TestMethod] > >>> public void TestThingsAreRunInOrder() { > >>> // Arrange > >>> MockRepository mocks = new MockRepository(); > > >>> IOrderedThing mockOrderedThing = > >>> mocks.DynamicMock<IOrderedThing>(); > > >>> MyTestClass classUnderTest = new > >>> MyTestClass(mockOrderedThing); > > >>> using (mocks.Record()) { > >>> using (mocks.Ordered()) { > >>> mockOrderedThing.Expect(thing => > >>> thing.FirstThing()); > >>> mockOrderedThing.Expect(thing => > >>> thing.SecondThing()); > >>> } > >>> } > > >>> mockOrderedThing.Replay(); > > >>> // Act > >>> classUnderTest.DoThingsInOrder(); > > >>> // Assert > >>> mockOrderedThing.VerifyAllExpectations(); > > >>> } > >>> } > >>> } > > >>> When I run the tests, I get the following error: > > >>> Test method > >>> RhinoMocksOrdredWithEvents.OrderedMockTests.TestThingsAreRunInOrder > >>> threw exception: > >>> Rhino.Mocks.Exceptions.ExpectationViolationException: > > >>> IOrderedThing.add_OnThingHappened(System.EventHandler`1[System.EventArgs]); > >>> Expected #1, Actual #0.. > > >>> Which is odd, since not only did I never say I expected the event to > >>> be added, but the event was, in fact, added. > > >>> If I comment out the event wiring, the test passes. If I wire the > >>> event in the method rather than in the constructor, the test passes. > > >>> It seems like a bug to me, but I'm very hesitant to call it such when > >>> it is far more likely to be the result of my own ignorance. So what > >>> am I missing? > > >>> -- Jason > > >>> -- > >>> 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]<rhinomocks%2bunsubscr...@googlegroups.com> > >>> . > >>> For more options, visit this group at > >>>http://groups.google.com/group/rhinomocks?hl=en. > > >> -- > >> Tim Barcz > >> Microsoft C# MVP > >> Microsoft ASPInsider > >>http://timbarcz.devlicio.us > >>http://www.twitter.com/timbarcz > > > -- > > Tim Barcz > > Microsoft C# MVP > > Microsoft ASPInsider > >http://timbarcz.devlicio.us > >http://www.twitter.com/timbarcz > > -- > Tim Barcz > Microsoft C# MVP > Microsoft > ASPInsiderhttp://timbarcz.devlicio.ushttp://www.twitter.com/timbarcz- Hide > quoted text - > > - Show quoted text - -- 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.
