Модульное тестирование MassTransit Consumer с XUnit - PullRequest
2 голосов
/ 12 апреля 2019

Моя команда только начинает использовать MassTransit, и мы пытаемся выяснить, как работает модульное тестирование реализаций IConsumer.Документация MassTransit является неполной, и все примеры, которые я нашел, используют NUnit.Мы пытаемся использовать XUnit с Moq для нашего модульного тестирования.

Я знаю, что нам нужно настроить один экземпляр тестового жгута MassTransit, который в NUnit выполняется с OneTimeSetup, и повторить, что мы должны использовать IClassFixture в XUnit.Я пытаюсь заставить его работать с тестовым набором.

Я видел пример Криса Паттерсона ConsumerTest_Specs.cs на MassTransit GitHub, но мне трудно перевести его на работу в XUnit.и Moq.https://github.com/MassTransit/MassTransit/blob/master/src/MassTransit.Tests/Testing/ConsumerTest_Specs.cs

Я пытаюсь протестировать очень простого потребителя для начала.Все, что он делает, это получает сообщение, а затем делает звонок в хранилище.Я хочу написать тест XUnit, который проверяет хранилище и проверяет, был ли вызван метод хранилища.

У кого-нибудь есть примеры, как сделать что-то подобное?

public class NewVMRequestRejectedConsumer : IConsumer<INewVMRequestRejected>
{
    private readonly INewVMRequestRepository _newVMRequestRepository;

    public NewVMRequestRejectedConsumer(INewVMRequestRepository newVMRequestRepository)
    {
        _newVMRequestRepository = newVMRequestRepository;
    }

    public Task Consume(ConsumeContext<INewVMRequestRejected> context)
    {
        _newVMRequestRepository.AddReasonForRejection(context.Message.RequestId, context.Message.Reason);
        return Task.CompletedTask;
    }
}

1 Ответ

0 голосов
/ 12 апреля 2019

Поскольку ConsumeContext<out T> и INewVMRequestRepository являются интерфейсами, нет проблем с тем, чтобы имитировать их, используя moq, например,

//Arrange
var repository = new Mock<INewVMRequestRepository>();
var sut = new NewVMRequestRejectedConsumer(repository.Object);

//Assert
sut.Consume(Mock.Of<ConsumeContext<INewVMRequestRejected>>(m =>
    m.Message.RequestId == "id" && m.Message.Reason == "reason"));

//Act
repository.Verify(m => m.AddReasonForRejection("id", "reason"), Times.Once);
...