Пересмешка 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());
Другие вопросы по тегам