public static async Task Test_SendPending() { // Arrange var unsentEmail = new EmailQueueItem { To = "[email protected]", Subject = "Unsent email subject", HtmlBody = "<p>Unsent email body</p>", PlainTextBody = "Unsent email body" }; var otherUnsentEmail = new EmailQueueItem { To = "[email protected]", Subject = "Other unsent email subject", HtmlBody = "<p>Other unsent email body</p>", PlainTextBody = "Other unsent email body" }; var unsentEmails = new[] { unsentEmail, otherUnsentEmail }; var mockEmailRepository = new Mock <IEmailRepository>(MockBehavior.Strict); mockEmailRepository .Setup(r => r.GetUnsent()) .Returns(unsentEmails); mockEmailRepository .Setup(r => r.MarkAsSent(It.IsAny <EmailQueueItem>())); var disabledMockEmailSender = new Mock <IEmailSender>(MockBehavior.Strict); disabledMockEmailSender .SetupGet(s => s.CanSend) .Returns(false); var enabledMockEmailSender = new Mock <IEmailSender>(MockBehavior.Strict); enabledMockEmailSender .SetupGet(s => s.CanSend) .Returns(true); enabledMockEmailSender .Setup(s => s.Send(It.IsAny <IEmailTemplate>())) .Returns(Task.CompletedTask); // Act var emailProcessor = new EmailProcessor( mockEmailRepository.Object, new[] { disabledMockEmailSender.Object, enabledMockEmailSender.Object }, Mock.Of <ILogger <EmailProcessor> >()); await emailProcessor.SendPending(); // Assert foreach (var emailQueueItem in unsentEmails) { enabledMockEmailSender.Verify( s => s.Send(It.Is <IEmailTemplate>(e => e.To == emailQueueItem.To && e.Subject == emailQueueItem.Subject && e.HtmlBody == emailQueueItem.HtmlBody && e.PlainTextBody == emailQueueItem.PlainTextBody)), Times.Once); mockEmailRepository.Verify( r => r.MarkAsSent(emailQueueItem), Times.Once); } }