Модульное тестирование с помощью связывателей модели ASP.NET MVC - PullRequest
2 голосов
/ 07 января 2009

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

[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. Единственное решение, о котором я могу подумать, - это, возможно, принять коллекцию значений имен (данные формы) и просто использовать UpdateModel / TryUpdateModel.

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

Ответы [ 2 ]

4 голосов
/ 07 января 2009

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

[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, если вы попытаетесь обновить сложную модель уполномоченного фреймворка, иногда она может выдавать исключения. Но написать собственное средство обновления модели очень просто, как мы сделали.

РЕДАКТИРОВАТЬ:

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

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

1 голос
/ 10 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...