我想为我正在编写的MSMQ应用程序创建一系列自动化单元测试。我认为,挑战在于如何从测试方法中容纳事件处理程序。也就是说,我从测试方法发送一条消息,需要将结果返回给该测试方法,该消息已被接收和处理。我不知道如何做到这一点,任何方向都将不胜感激。

有帮助吗?

解决方案

您是否正在寻找一种方法来编写单元测试,其中被测系统认为它正在从队列接收事件,但您不想在测试期间使用真实队列?

查看 Rhino Mocks 。它允许您创建队列接口的模拟版本,然后在测试期间从其中引发事件。一些用于测试Requester.DoSomething()方法的伪代码可能如下所示:

// SETUP
MockRepository mocks = new MockRepository();
IQueue mockQueue = mocks.StrictMock<IQueue>();

queue.Received+=null;//create an expectation that someone will subscribe to this event
LastCall.IgnoreArguments();// we don't care who is subscribing
IEventRaiser raiseReceivedEvent = LastCall.GetEventRaiser();//get event raiser for the last event, in this case, Received
Expect.Call(mockQueue.Send).Return(msgId);
mocks.ReplayAll();

// EXEC
Requester req = new Requester(mockQueue);

// We expect this method to send a request to the mock queue object.
req.DoSomething();
// Now we raise an event from the mock queue object.
raiseReceivedEvent.Raise(eventArgs);

// VERIFY
// we would probably also check some state in the Requester object
mocks.VerifyAll();

查看 Rhino mocks wiki 了解所有细节。

其他提示

通常,单元测试应该隔离被测试的方法。我不熟悉MSMQ,但您通常会创建一个模拟对象并将其传递给您的生产方法。然后,您可以感知方法对模拟对象所做的操作,以正确验证其行为并发送预期的响应。生产方法不会知道差异。单元测试更多的是确保您的方法在预期的情况下单独运行。

声音就像你正在寻找的是集成测试。您仍然可以使用单元测试框架来完成此任务,但我不会将它们包含在自动构建中。我会将它们移到专用的测试机器上。单元测试通常会停止构建,因为它们表示某个类或方法的行为不符合预期。集成测试表明,方法或类没有按预期相互影响。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top