我正在努力让消息头从 nServiceBus (v3.3.0.0) 中的单元测试中工作。标头在测试中使用 SetIncomingHeader(...) 设置,但是当我在消息处理程序中调用 GetHeader(...) 时,我得到字符串:
没有定义标题获取标题操作,请使用 ExtensionMethods.GetHeaderAction = ...
标头在测试框架之外工作正常。
FullDuplex示例应用程序基本上显示了我正在使用的代码,并遇到了同样的问题。有谁知道我是如何设置 GetHeaderAction 方法的?
提前谢谢。
正如为什么 NServiceBus OutgoingHeaders 是静态的而不是 ThreadStatic?中提到的,您可以定义自己的 GetHeaderAction,当 NSB 显然没有运行时,在对项目进行单元测试时调用该操作。
ExtensionMethods.GetHeaderAction =
((msg, key) => this.Manager.GetHeader(msg, key));
正如约翰所提到的,这是固定的
- https://github.com/NServiceBus/NServiceBus/issues/933
另外,请确保您使用的是 NServiceBus.Testing 框架,如下所述:
- http://docs.particular.net/nservicebus/testing/
例:
[TestFixture]
public class Tests
{
[Test]
public void Run()
{
Test.Initialize();
Test.Handler<MyMessageHandler>()
.SetIncomingHeader("Test", "abc")
.ExpectReply<ResponseMessage>(m => Test.Bus.GetMessageHeader(m, "MyHeaderKey") == "myHeaderValue")
.OnMessage<RequestMessage>(m => m.String = "hello");
}
}
class MyMessageHandler : IHandleMessages<RequestMessage>
{
public IBus Bus { get; set; }
public void Handle(RequestMessage message)
{
ResponseMessage responseMessage = new ResponseMessage();
Bus.SetMessageHeader(responseMessage, "MyHeaderKey", "myHeaderValue");
Bus.Reply(responseMessage);
}
}
请注意,这是针对NServiceBus v4/v5的。有关其他版本,请访问文档。