代码之家  ›  专栏  ›  技术社区  ›  David Robbins

使用Visual Studio测试套件/nunit自动化集成测试msmq的最佳方法是什么?

  •  3
  • David Robbins  · 技术社区  · 16 年前

    我想为我正在编写的msmq应用程序创建一系列自动单元测试。正如我看到的,挑战在于如何适应测试方法中的事件处理程序。也就是说,我从测试方法发送一条消息,需要将结果返回到该测试方法,该消息已经被接收和处理。我不知道如何做到这一点,任何方向都会受到极大的赞赏。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Don Kirkby    16 年前

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

    退房 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 所有细节。

        2
  •  1
  •   Kenneth Cochran    16 年前

    通常,单元测试应该隔离正在测试的方法。我不熟悉msmq,但您通常会创建一个模拟对象并将其传递给您的生产方法。然后您可以感觉到该方法对模拟对象做了什么,以验证其行为是否正确,并发送预期的响应。生产方法不知道有什么区别。单元测试更能确保您的方法独立地按照预期的方式运行。

    声音就像你要找的是一个集成测试。您仍然可以使用单元测试框架来完成这一点,但我不会将它们包括在自动化构建中。我会把它们移到专用的测试机上。单元测试通常会停止一个构建,因为它们表示一个类或方法的行为不符合预期。如集成测试所示,方法或类没有如预期那样相互作用。