在nServicebus中测试消息头

时间:2013-01-30 14:00:51

标签: unit-testing nservicebus

我很难通过nServiceBus(v3.3.0.0)中的单元测试来获取消息头。使用SetIncomingHeader(...)在测试中设置标题,但是当我在消息处理程序中调用GetHeader(...)时,我得到字符串:

  

未定义标头获取标头操作,请使用spicify   ExtensionMethods.GetHeaderAction = ...

标题在测试框架之外工作正常。

FullDuplex示例应用程序基本上显示了我正在使用的代码并遇到同样的问题。有谁知道我如何设置GetHeaderAction方法?

提前致谢。

2 个答案:

答案 0 :(得分:2)

Why NServiceBus OutgoingHeaders is static and not ThreadStatic?中所提到的,您可以定义自己的GetHeaderAction,当NSB显然没有运行时,在单元测试项目时调用它。

ExtensionMethods.GetHeaderAction =
    ((msg, key) => this.Manager.GetHeader(msg, key));

答案 1 :(得分:0)

如John所述,这已在

中修复

另外,请确保您使用的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。有关其他版本,请访问文档。