Модульное тестирование MassTransit Consumer с XUnit

2

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

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

Я видел пример Криса Паттерсона ConsumerTest_Specs.cs на GitHub MassTransit, но мне трудно перевести его для работы в 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;
    }
}
Теги:
asp.net-core
moq
masstransit
xunit

1 ответ

0

Поскольку 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);
  • 0
    Спасибо!! Я должен был понять это. Думаю, я рассчитывал, что с MassTransit будет какая-то хитрость. Быть глупым может быть бременем.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню