2015-06-26 9 views
2

Я получаю сообщение об ошибке при попытке протестировать класс (FindTask), который совершает вызов другого класса (NotificationMailer), который наследуется от MVC MailerBase.Ошибка при использовании Machine.Specs для тестирования класса с использованием MVC MailerBase

System.ArgumentNullException: Значение не может быть пустым. Имя параметра: HttpContext

class FindTask 
{ 
    public void Find() 
    { 
     notificationMailer.Notify("Some message").Send(); 
    } 
} 

Я пытаюсь проверить, что FindTask вызовы NotificationMailer::Notify.

public class NotificationMailer : MailerBase, INotificationMailer 
{ 
    public NotificationMailer() 
    { 
     MasterName = "_Layout"; 
    } 

    public virtual MvcMailMessage Notify(string message) 
    { 
     return Populate(x => 
     { 
      x.Subject = "Some Notification"; 
      x.ViewName = "Notify"; 
      x.To.Add("[email protected]"); 
      x.Body = message; 
     }); 
    } 
} 

Ошибка на возвратного заселить (...) линии.

public class FindTaskSpec : WithSubject<FindTask> 
{ 
    Establish context =() => 
    { 
     MvcMailMessage mailMessage = new MvcMailMessage(); 
     The<INotificationMailer>() 
      .WhenToldTo(x => x.Notify(Param<string>.IsAnything)) 
      .Return(mailMessage); 
    }; 

    Because of =() => Subject.Find(); 
} 

public class when_something_is_found : FindTaskSpec 
{ 
    It should_send_an_email_with_the_found_stuff =() => The<IDeadLinkMailer>() 
     .WasToldTo(x => x.Notify(Param<string>.IsAnything)) 
     .OnlyOnce(); 
} 

Я думаю, что линия Установить контекст (Мок) должен диктовать, что если Уведомлять называется, он должен вернуть новый MVCMailMessage без запуска через тело функции.

Мои вопросы:

  1. Как я могу решить эту ошибку и тест, чтобы убедиться, что метод Notify называется?

  2. Почему он издевается над Notify не останавливает тест от входа в тело функции уведомления?

На стороне записки я уже попытался установить MailerBase.IsTestModeEnabled = истина. Это приводит к ошибке Url - Недопустимый адрес: Url Empty;

Я прочитал their wiki page on setting up tests for MvcMailer.

Я также прочитал почти все другие страницы переполнения стека. Я думаю, что ссылка this была наиболее полезной. Проблема в том, что я не знаю, как имитировать то, что они делают в этой ссылке с Machine.Specifications.

Я думаю, что моя проблема будет решена, если я смогу создать макет для любого из методов, показанных в ссылках.

+0

Это кажется насмешливой проблемой, а не проблемой MSpec ... –

ответ

3

Я думаю, что в этой ситуации я бы соблазн просто создать FakeNotificationMailer класс, унаследовав от NotificationMailer и переопределения метода Notify и с его возвращает преднастроенный MvcMailMessage. Это по сути то же, что и ваш макет, но все явственно. Что-то вроде:

public class FakeNotificationMailer : MailerBase, INotificationMailer 
    { 
    MvcMailMessage preBuiltMessage; 
    public NotificationMailer(MvcMailMessage result) 
     { 
     preBuiltMessage = result; 
     } 

    public virtual MvcMailMessage Notify(string message) 
     { 
     return preBuiltMessage; 
     } 
    } 

(у меня были проблемы, выяснить, что ваши зависимостей, так что это немного выстрел в темноте).

Конечно, вы должны найти где-нибудь, что вы можете ввести свою фальшивую реализацию (принцип инверсии зависимостей).

 Смежные вопросы

  • Нет связанных вопросов^_^