Пересмешка MailController с помощью ActionMailer.net с использованием Moq
Я пытаюсь издеваться MailController
_mockMailController = new Mock<IMailController>();
_mockMailController.Setup(x => x.ForgotPassword("test@email.com"));
Мой контроллер принимает IMailController
как зависимость, однако, когда я звоню
mailController.ForgotPassword("test@email.com").Deliver();
Я получаю исключение NullReferenceException (потому что ForgotPassword
ничего не возвращает, наверное)
В идеале мы бы заглушки EmailResult
?
2 ответа
Я создал запрос на извлечение для ActionMailer.Net, который вводит интерфейс IEmailResult, который делает макет очень простым. Посмотри на это:
https://bitbucket.org/swaj/actionmailer.net/pull-request/4/iemailresult-interface-for-better/
Пока запрос на объединение не будет объединен, вы можете использовать пользовательскую сборку из моего проекта.
https://bitbucket.org/hydr/xv-actionmailer.net
Mocking get так же просто, как писать (с FakeItEasy Moq может быть похожим):
//SetUp
_myMailer = A.Fake<IMyMailer>();
//Later on in Assert
A.CallTo(() => _myMailer.MyTestEmail()).MustHaveHappened(Repeated.Exactly.Once);
когда почтовик определен как:
public class MailController : MailerBase, IMyMailer
{
public IEmailResult MyTestEmail()
{
To.Add("recipient@sdf.com");
From = "sender@sdf.com";
Subject = "Subject";
return Email();
}
}
Вы не создали настройки для ложного возврата значения из метода ForgotPassword. При поведении по умолчанию это вернет значение по умолчанию для типа, который в данном случае равен нулю.
Вы можете смоделировать возвращаемое значение следующим образом:
_mockMailController.Setup(x => x.ForgotPassword("test@email.com"))
.Returns(new SomeType());