NullReferenceException при тестировании DefaultModelBinder - PullRequest
0 голосов
/ 25 апреля 2010

Я разрабатываю проект, используя методы BDD / TDD, и я стараюсь изо всех сил, чтобы остаться на курсе. Проблема, с которой я только что столкнулся, - это модульное тестирование DefaultModelBinder. Я использую mspec для написания своих тестов.

У меня есть такой класс, к которому я хочу привязаться:

public class EmailMessageInput : IMessageInput
    {
        public object Recipient
        {
            get; set;
        }

        public string Body
        {
            get; set;
        }

    }

Вот как я строю свой контекст спецификации. Я собираю ложную коллекцию форм и вставляю ее в объект bindingContext.

public abstract class given_a_controller_with_valid_email_input : 
            given_a_controller_context
        {
            Establish additional_context = () =>
                               {
                                   var form = new FormCollection
                                                  {
                                                      new NameValueCollection
                                                          {
                                                              { "EmailMessageInput.Recipient", "test@test.com"},
                                                              { "EmailMessageInput.Body", "Test body." }
                                                          }
                                                  };

                                   _bindingContext = new ModelBindingContext
                                                         {
                                                             ModelName = "EmailMessageInput",
                                                             ValueProvider = form
                                                         };

                                   _modelBinder = new DefaultModelBinder();
                               };

            protected static ModelBindingContext _bindingContext;
            protected static DefaultModelBinder _modelBinder;
        }

        public abstract class given_a_controller_context
        {
            protected static MessageController _controller;

            Establish context =
                () =>
                    {
                        _controller = new MessageController();
                    };
        }

Наконец, моя спецификация выдает исключение нулевой ссылки, когда я выполняю .BindModel () из одной из моих спецификаций:

Because of = () => 
                 {
                     _model = _modelBinder.BindModel(null, _bindingContext);
                 };

Любая подсказка, что это может быть?

Не стесняйтесь спрашивать меня о дополнительной информации, если это необходимо. Я мог бы принять что-то как должное.

1 Ответ

0 голосов
/ 16 мая 2010

Боюсь, мне придется начать с вопроса: почему вы тестируете связующее по умолчанию для модели? Класс DefaultModelBinder является частью фреймворка, поэтому тестирование не входит в ваши обязанности. Вы должны предположить, что это рабочий черный ящик.

Во всяком случае, глядя на ваш код, я думаю, что вы пытаетесь добиться, чтобы получить связанную модель для дальнейшего тестирования; я на правильном пути? если это так, я бы порекомендовал вам посмотреть расширения MSpec Джеймса Брума для MVC

Исходный код поставляется с несколькими примерами; но это позволяет вам, например, вызвать метод действия на контроллере и воздействовать на (напечатанный!) ViewModel (тот, который вы передаете в представление из действия контроллера), просто выполнив

It should_display_the_person_name = () => result.Model<Person>().Name.ShouldNotBeNull();

Надеюсь, это поможет

...