Моя команда только начинает использовать 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;
}
}
Поскольку 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);