У меня есть контроллер, который реализует простую операцию Добавить на сущность и перенаправляет на страницу Детали:Модульное тестирование контроллера в ASP.NET MVC 2 с RedirectToAction
[HttpPost]
public ActionResult Add(Thing thing)
{
// ... do validation, db stuff ...
return this.RedirectToAction<c => c.Details(thing.Id));
}
Это прекрасно работает (с использованием RedirectToAction от сборка MvcContrib).
Когда я тестирую этот метод, я хочу получить доступ к представлению ViewData, которое возвращается из действия Details (так что я могу получить первичный ключ вновь вставленной вещи и доказать, что он теперь находится в базе данных).
Испытание:
var result = controller.Add(thing);
Но результат здесь типа: System.Web.Mvc.RedirectToRouteResult
(который является System.Web.Mvc.ActionResult
). Он еще не выполнил метод Details.
Я попытался позвонить ExecuteResult
на возвращаемом объекте, проходящем в издеваемом ControllerContext
, но структура была недовольна отсутствием деталей в издеваемом объекте.
Я мог бы попробовать заполнить детали и т. Д., Но тогда мой тестовый код намного длиннее кода, который я тестирую, и я чувствую, что мне нужны модульные тесты для модульных тестов!
Я что-то упустил в философии тестирования? Как проверить это действие, когда я не могу получить его возвращенное состояние?
Спасибо, что определенно помогает избежать трудностей с каркасом во время тестирования. Итак, следуя этой идиоме, я бы получил модульные тесты для DBService, которые доказывают, что я могу добавить вещи, и единичный тест для контроллера, подтверждающий, что его вызовы сохраняются в сервисе. Но я действительно не доказал, что вещь, переданная в контроллер, попадает в базу данных. Возможно, я мог бы сделать это с целым рядом более сложных издевательских правил ... но это не очень хорошо, для простой операции очень много тестовых котлов. –
Ну, определяя масштаб и усилие, чтобы сдавать тесты, что тестировать и т. Д., Я тоже борюсь. Я думаю, вы должны попытаться разделить свои тесты на две категории: модульные тесты и интеграционные тесты. В модульных тестах должны тестироваться только очень маленькие единицы функциональности, такие как тесты выше. Интеграционные тесты должны смотреть на то, как все интегрируется, возможно, охватывая небольшую историю пользователей, которая у вас есть. Я бы предпочел сделать интеграционные тесты как можно ближе к «реальному» использованию, например, запустить WatiN и на самом деле щелкнуть пару ссылок. Не нужно вообще насмехаться над этим. – rmac
Если вы протестируете свой DBService, убедитесь, что он работает. Затем вы должны предположить, что он может, и он будет обрабатывать вызовы базы данных правильно. Поэтому, если ваш контроллер использует эту услугу, вы знаете, что она будет работать. С помощью фальшивой структуры вы можете проверить параметры, которые передаются методам службы, и этого достаточно. Я думаю, что rmacfie прав, возможно, вы пытаетесь проверить слишком много глубже. Ваш модульный тест должен охватывать только одно действие, а не весь процесс. –