2

我正在尝试在我的解决方案中创建一个高级测试,并且我想“捕获”发送到总线的消息。

这就是我所做的:

  1. nUnit [SetUp] 在 IISExpress 中启动 WebAPI 项目
  2. SetUp 还会创建总线
  3. 向 API 发送 HTTP 请求
  4. 验证我想验证的任何内容

整个测试的 WebAPI 部分运行良好。公共汽车的创建和启动似乎也很棒。它甚至可以找到我的假消息处理程序。问题是处理程序永远不会收到来自队列的命令,它们只是永远留在 RabbitMQ 队列中。

以下是总线的配置方式:

var bus = Configure.With()
                   .DefineEndpointName("Local")
                   .Log4Net()
                   .UseTransport<global::NServiceBus.RabbitMQ>()
                   .UseInMemoryTimeoutPersister()
                   .RijndaelEncryptionService()
                   .UnicastBus();
                   .CreateBus();

在 NServiceBus 启动的日志中,我看到我的假处理程序与命令相关联:

2014-09-24 15:29:59,007 [Runner thread] DEBUG NServiceBus.Unicast.MessageHandlerRegistry 
[(null)] <(null)> - Associated 'Bloo.MyCommand' message with 'Blah.FakeMyCommandHandler' handler

因此,当消息到达正确的 RabbitMQ 队列时,我假设一切都在处理程序点正常工作之前。

我已经尝试在我的 [TearDown] 中放置等待,以便总线寿命更长一些 - 希望给处理程序时间来接收消息。我还尝试将交互的消费者部分的内存总线分离到一个新线程中,但没有成功。

有没有其他人试过这个?

这只是第一步,我想做的是创建一个记录发送给它的消息的假总线。RabbitMQ 的需要只是为了让自己继续前进(我的解决方案的范围是前面的 WebAPI 和后面的总线)。

干杯

4

3 回答 3

2

您忘记在总线上调用 .Start(),这就是它不收听消息的原因。

有关更多信息,请参见此处:http: //docs.particular.net/nservicebus/hosting-nservicebus-in-your-own-process-v4.x

此外,考虑使用 NServiceBus.Testing 对您的处理程序和 sagas 进行单元测试:

https://www.nuget.org/packages/NServiceBus.Testing

于 2014-09-24T22:41:23.910 回答
1

如果您尝试使用实际队列进行完整的集成测试,那么这个答案对您没有帮助。

如果您正在进行更集中的测试,即测试依赖总线的单个组件,我建议您使用模拟框架(我喜欢 Moq)并模拟 IBus。然后,您可以验证您希望发送到总线的消息是否确实已发送。

于 2014-09-24T15:39:33.923 回答
1

我猜您的消息只是永远坐在您的队列中,因为您的端点正在侦听“Local.MachineName”队列而不是“Local”

如果您将 ScaleOut 设置为 SingleBrokerQueue 这应该对问题进行排序。

Configure.ScaleOut(s => s.UseSingleBrokerQueue());

var bus = Configure.With()
               .DefineEndpointName("Local")
               ...
于 2014-09-25T15:27:37.860 回答