NullReferenceException При тестировании defaultmodelbinder
-
01-10-2019 - |
Вопрос
Я разрабатываю проект, используя методы BDD / TDD, и я стараюсь изо всех сил, чтобы остаться курсом. Проблема, в которой я только что столкнулся, это единица тестирования по умолчанию ModelBinder. Я использую 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();
};
}
Наконец, мои спецификации бросают исключение NULL CASTER, когда я выполняю .bindmodel () изнутри одного из моих спецификаций:
Because of = () =>
{
_model = _modelBinder.BindModel(null, _bindingContext);
};
Любое подсказка, что это может быть?
Не стесняйтесь спросить меня для получения дополнительной информации, если это необходимо. Я мог бы предпринять что-то как должное.
Решение
Боюсь, мне придется начать с вопросов: почему вы проверяете связующее модель по умолчанию? То DefaultModelBinder
Класс является частью структуры, и поэтому не обязанность тестирования. Вы должны предположить, что это рабочий черный ящик.
Во всяком случае, глядя на свой код, я думаю, что то, что вы пытаетесь сделать, - это получить связанную модель для дальнейшего тестирования; Я на правильном пути? Если это так, я бы порекомендовал вам посмотреть Джеймс Брумские расширения MSPEC для MVC
Исходный код поставляется с несколькими примерами; Но это позволяет вам, например, вызывать метод действия на контроллере и действовать на (набранный!) ViewModel (тот, который вы передаете к представлению от действия контроллера), просто делая
It should_display_the_person_name = () => result.Model<Person>().Name.ShouldNotBeNull();
Надеюсь это поможет