Мне было интересно, как лучше всего использовать действия контроллера модульного тестирования, использующие привязку модели.
[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.
Я также хочу проверить, правильно ли работает привязка модели, поэтому я хотел бы возложить ответственность за создание нового продукта на привязку модели.





Я не уверен, что понимаю проблему, почему вы не можете просто сделать это:
[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.
А, понятно. Что ж, использование переменных сообщения формы поможет вам протестировать привязку модели .... Я отредактирую свой пост.
Думаю, я последую вашему совету и сохраню конкретный объем. Спасибо!
Вам нужно только протестировать настраиваемый связыватель модели (полученный из DefaultModelBinder или реализующий IModelBinder).
Теперь вы только что предоставили контроллеру ValueProvider.
Извините, я не понял. Я подумал о другом предложении, которое забыл добавить в конец, но не стал. Редактирование ....