public void TestRun() { ILogMessage message1 = Substitute.For <ILogMessage>(); ILogMessage message2 = Substitute.For <ILogMessage>(); ILogMessage message3 = Substitute.For <ILogMessage>(); ILogMessage message4 = Substitute.For <ILogMessage>(); ILogMessage message5 = Substitute.For <ILogMessage>(); ILogMessage message6 = Substitute.For <ILogMessage>(); IMessageQueue <ILogMessage> messageQueue = Substitute.For <IMessageQueue <ILogMessage> >(); QueueLogRunner logRunner = new QueueLogRunner(messageQueue, 0); int counter = 0; messageQueue.TakeAll().Returns(delegate { IMessageQueue <ILogMessage> messageQueue2 = Substitute.For <IMessageQueue <ILogMessage> >(); if (counter == 0) { messageQueue2.GetEnumerator().Returns(new ArrayEnumerator <ILogMessage>(message1, message2)); } else if (counter == 1) { logRunner.RequestStop(); // Called from Running state messageQueue2.GetEnumerator().Returns(new ArrayEnumerator <ILogMessage>(message3, message4)); } else { logRunner.RequestStop(); // Called from StopRequested state messageQueue2.GetEnumerator().Returns(new ArrayEnumerator <ILogMessage>(message5, message6)); } counter++; return(messageQueue2); }); IBasicLogger logger = Substitute.For <IBasicLogger>(); logRunner.Run(logger); logRunner.RequestStop(); // Called from Stopped state Received.InOrder(delegate { message1.LogTo(logger); message2.LogTo(logger); message3.LogTo(logger); message4.LogTo(logger); message5.LogTo(logger); message6.LogTo(logger); }); }