4

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

4

2 回答 2

1

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

查看犀牛模拟。它允许您创建队列接口的模拟版本,然后在测试期间从中引发事件。一些用于测试 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了解所有细节。

于 2009-05-13T18:29:18.820 回答
1

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

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

于 2009-05-06T19:42:28.823 回答