Идентификатор модульного тестирования с Rebus - PullRequest
0 голосов
/ 06 июня 2018

Итак, при условии, что у меня есть Handler, который выглядит следующим образом:

public async Task Handle(Message message)
{
    Guid correlationId = GetCorrelationId();

    var newMessage = new MessageReceived
    {
        horse = message.Horse,
        correlationId = correlationId
    };
}

private static Guid GetCorrelationId()
{
    if (!MessageContext.Current.Headers.TryGetValue("rbs2-corr-id", out string correlationId))
    {
        throw new ArgumentException();
    }

    if (!Guid.TryParse(correlationId, out Guid correlationIdGuid))
    {
        throw new ArgumentException();
    }

    return correlationIdGuid;
}

Как бы мне было провести модульное тестирование?В настоящее время у меня есть (очевидно, ошибочный) тест, в котором я просто установил объект MessageReceived и передал его на Handle, но, конечно, он не работает на GetCorrelationId, поскольку фактического MessageContext нет.Должен ли я установить FakeBus и каким-то образом его использовать?

1 Ответ

0 голосов
/ 06 июня 2018

Вместо доступа к текущему IMessageContext через статическое свойство MessageContext.Current, вы должны вставить его в конструктор вашего обработчика следующим образом:

public class MyHandler : IHandleMessages<Message>
{
    public MyHandler(IMessageContext messageContext)
    {
        this.messageContext = messageContext;
    }

    public async Task Handle(Message message)
    {
        Guid correlationId = GetCorrelationId(messageContext);

        var newMessage = new MessageReceived
        {
            horse = message.Horse,
            correlationId = correlationId
        };
    }

    static Guid GetCorrelationId(IMessageContext messageContext)
    {
        if (!messageContext.Headers.TryGetValue("rbs2-corr-id", out string correlationId))
        {
            throw new ArgumentException();
        }

        if (!Guid.TryParse(correlationId, out Guid correlationIdGuid))
        {
            throw new ArgumentException();
        }

        return correlationIdGuid;
    }
}

Это упростит вам реализациюфальшивый контекст сообщения для вставки во время тестирования:)

...