Модульное тестирование со связывателями моделей ASP.NET MVC

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

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult AddProduct(Product product)
{
}

Мне было интересно, как вы вызываете метод контроллера для модульного тестирования. Если вы попробуете что-то подобное ...

public void Catalog_AddProduct()
{
    CatalogController controller = new CatalogController();
    // some mocking for controller context, setting form values etc...
    controller.AddProduct(// ?);
}

Некоторые могут предложить удалить Product в качестве параметра, но у меня также есть другое действие контроллера AddProduct, которое используется только для HTTP-Gets. Единственное решение, которое я мог придумать, - это, возможно, принять коллекцию namevalue (данные формы) и просто использовать UpdateModel / TryUpdateModel.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 451
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я не уверен, что понимаю проблему, почему вы не можете просто сделать это:

[TestMethod()]
public void AddProductTest()
{
    CatalogController target = new CatalogController(/*testing variables*/);
    target.AddProduct(new Product { /* product details for testing */ });

    // Test the results
}

Хотя, возможно, я не понимаю проблемы. Использование переменных сообщения формы - хороший подход, однако он будет работать очень хорошо, когда вам нужно внести изменения в продукт, и через некоторое время вы можете обнаружить, что намного проще, чтобы все ваши действия принимали переменные сообщения формы и обновляли вашу модель. В отношении TryUpdateModel и UpdateModel стоит отметить одну вещь: мы столкнулись с ошибкой в ​​Entity Framework: если вы попытаетесь обновить сложную модель платформы Entity, она иногда может вызывать исключения. Но очень легко написать собственное средство обновления модели, как это сделали мы.

Обновлено:

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

Если вам действительно нужно протестировать привязку модели, единственный известный мне способ - передать переменные сообщения формы, а затем использовать метод TryUpdateModel.

Извините, я не понял. Я подумал о другом предложении, которое забыл добавить в конец, но не стал. Редактирование ....

Chad Moran 07.01.2009 01:13

А, понятно. Что ж, использование переменных сообщения формы поможет вам протестировать привязку модели .... Я отредактирую свой пост.

Odd 07.01.2009 01:20

Думаю, я последую вашему совету и сохраню конкретный объем. Спасибо!

Chad Moran 07.01.2009 01:23

Вам нужно только протестировать настраиваемый связыватель модели (полученный из DefaultModelBinder или реализующий IModelBinder).

Matt Hinze 07.01.2009 15:24

Теперь вы только что предоставили контроллеру ValueProvider.

Другие вопросы по теме