public async Task RunProcessingAsyncProcessMessagesCorrectlyAsync() { // Arrange var fetcher = new Mock <IOutboxFetcher>(); var scopedFactory = new Mock <IServiceScopeFactory>(); var ilogger = new Mock <ILogger <Outbox> >(); var outBox = new Outbox(fetcher.Object, scopedFactory.Object, ilogger.Object); var tokenSource = new CancellationTokenSource(); var msg = new TestMessage(); fetcher.Setup(x => x.ReadOutboxMessagesAsync(tokenSource.Token)).ReturnsAsync(new[] { msg }); var scope = new Mock <IServiceScope>(); scopedFactory.Setup(x => x.CreateScope()).Returns(scope.Object); var provider = new Mock <IServiceProvider>(); scope.Setup(x => x.ServiceProvider).Returns(provider.Object); var processor = new Mock <IOutboxMessageProcessor>(); provider.Setup(x => x.GetService(typeof(IOutboxMessageProcessor))).Returns(processor.Object); // Act var exception = await Record.ExceptionAsync(async() => await outBox.RunProcessingAsync(tokenSource.Token)); // Assert exception.Should().BeNull(); fetcher.Verify(x => x.ReadOutboxMessagesAsync(tokenSource.Token), Times.Once); scopedFactory.Verify(x => x.CreateScope(), Times.Once); scope.Verify(x => x.ServiceProvider, Times.Once); provider.Verify(x => x.GetService(typeof(IOutboxMessageProcessor)), Times.Once); processor.Verify(x => x.TryProcessAsync(msg, tokenSource.Token), Times.Once); scope.Verify(x => x.Dispose(), Times.Once); }