在 nServicebus 中测试消息标头



我正在努力让消息头从 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的。有关其他版本,请访问文档。

最新更新