public void SendMailTest()
        {
            //Arrange
            var email          = new Mock <EmailBase>();
            var mailMessage    = new Mock <IEmailBuilder>();
            var mailClient     = new Mock <IMailClient>();
            var mailFactory    = new Mock <IEmailFactory>();
            var mailIntialezer = new Mock <IEmailInitializer>();

            mailFactory.Setup(m => m.CreateEmailBuilder()).Returns(mailMessage.Object);
            mailFactory.Setup(m => m.CreateMailClient()).Returns(mailClient.Object);

            var tcs = new TaskCompletionSource <object>();

            mailClient.Setup(m => m.Send(mailMessage.Object)).Returns(() =>
            {
                tcs.SetResult(null);
                return(tcs.Task);
            });

            var repository = new MailerRepository(mailFactory.Object, mailIntialezer.Object);

            //Act
            var task = repository.SendMail(email.Object);

            //Assert
            Assert.AreEqual(tcs.Task, task);
            mailIntialezer.Verify(m => m.Initialize(mailMessage.Object, email.Object), Times.Once());
        }
        public void SendMailsTest()
        {
            //Arrange
            var emailBuilder1  = new Mock <IEmailBuilder>();
            var emailBuilder2  = new Mock <IEmailBuilder>();
            var mailClient1    = new Mock <IMailClient>();
            var mailClient2    = new Mock <IMailClient>();
            var mailFactory    = new Mock <IEmailFactory>();
            var mailIntialezer = new Mock <IEmailInitializer>();

            mailFactory.SetupSequence(m => m.CreateEmailBuilder())
            .Returns(emailBuilder1.Object)
            .Returns(emailBuilder2.Object);

            mailFactory.SetupSequence(m => m.CreateMailClient())
            .Returns(mailClient1.Object)
            .Returns(mailClient2.Object);

            var emailList = new List <EmailBase>()
            {
                new Mock <EmailBase>().Object, new Mock <EmailBase>().Object
            };
            var repository = new MailerRepository(mailFactory.Object, mailIntialezer.Object);

            mailClient1.Setup(m => m.Send(It.IsAny <IEmailBuilder>())).Returns(() =>
            {
                var tcs = new TaskCompletionSource <object>();
                tcs.SetResult(null);
                return(tcs.Task);
            });
            mailClient2.Setup(m => m.Send(It.IsAny <IEmailBuilder>())).Returns(() =>
            {
                var tcs = new TaskCompletionSource <object>();
                tcs.SetResult(null);
                return(tcs.Task);
            });

            //Act
            var task = repository.SendMails(emailList);

            task.Wait();

            //Assert
            mailIntialezer.Verify(m => m.Initialize(emailBuilder1.Object, emailList[0]), Times.Once());
            mailIntialezer.Verify(m => m.Initialize(emailBuilder2.Object, emailList[1]), Times.Once());
            mailClient1.Verify(m => m.Send(emailBuilder1.Object), Times.Once());
            mailClient2.Verify(m => m.Send(emailBuilder2.Object), Times.Once());
        }