Testing 单元测试NServiceBus处理器';s对其发送的回复的处理

Testing 单元测试NServiceBus处理器';s对其发送的回复的处理,testing,nservicebus,Testing,Nservicebus,我有一个处理程序,当它处理某个事件时,会发送一个请求,并且根据回复可能会发布一个警报。我试图使用NServiceBus测试框架来测试这一点,但不太明白如何假装总线正在应答。我已经看到了如何测试发送(使用test.Handler(…).ExpectSend…)的示例,以及如何在执行回复的另一个处理程序中测试回复(使用test.Handler(…).ExpectReply),但没有看到关于存根回复以测试回复处理的示例 我的处理程序的Handle方法如下所示: public void Handle(S

我有一个处理程序,当它处理某个事件时,会发送一个请求,并且根据回复可能会发布一个警报。我试图使用NServiceBus测试框架来测试这一点,但不太明白如何假装总线正在应答。我已经看到了如何测试发送(使用test.Handler(…).ExpectSend…)的示例,以及如何在执行回复的另一个处理程序中测试回复(使用test.Handler(…).ExpectReply),但没有看到关于存根回复以测试回复处理的示例

我的处理程序的Handle方法如下所示:

public void Handle(SomeEvent @event)
{
   bus.Send<SomeRequest>(request => { request.Stuff = @event.Stuff })
       .Register<SomeReply>(reply => { if (reply.OhNo) bus.Publish(new SomeAlert("augh!")); });
}

谢谢你的建议

消息处理程序是没有状态的单调用对象,因此对.Register的调用将无法按预期工作。您可以将应答处理逻辑移动到一个单独的消息处理程序(因为它看起来不像您有任何依赖于从请求中记住某些内容的行为),或者如果您需要更复杂的编排,可以使用saga

顺便说一句,您也不会使用.Register来注册您的sagas,相反,您会有一个单独的句柄方法来处理响应。它们也有一个更完整的测试API,虽然我不认为在这种情况下使用它们是一个理由。
从一个单独的响应消息类型处理程序开始。

好吧——我几乎要放弃并添加一个单独的处理程序了。但是全双工示例确保寄存器回调看起来是“正确”的方式。那么,你能解释一下什么时候注册合适吗?顺便说一句,谢谢你们的快速回答——你们总是为此而摇滚!。Register用于在web应用程序中注册回调通知,当您试图强制异步消息传递的行为更像RPC调用时。这有点像是一种消息传递的反模式,我不会太依赖它。
Test.Handler(bus => new MyHandler(bus, serviceMock.Object)).
   ExpectSend(verifyRequest).
   // thought maybe something here like .StubReply(someReply) or something?
   ExpectPublish(verifyAlert).
   OnMessage(@event, "xyz");