Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Рассмотрим на примере тестирование создания модели и переадресации. Во-первых, нам нужен минимальный код для запуска тестов. Для этого возьмем проект веб-приложения из прошлой темы и определим в нем стандартный метод Create:
public ActionResult Create() { return View(); } [HttpPost] public ActionResult Create(Computer c) { return View(); }
Это минимальный код, достаточный для написания тестов. Теперь в класс тестов HomeControllerTest добавим ряд методов:
[TestMethod] public void CreatePostAction_ModelError() { // arrange string expected = "Create"; var mock = new Mock<IRepository>(); Computer comp = new Computer(); HomeController controller = new HomeController(mock.Object); controller.ModelState.AddModelError("Name", "Название модели не установлено"); // act ViewResult result = controller.Create(comp) as ViewResult; // assert Assert.IsNotNull(result); Assert.AreEqual(expected, result.ViewName); }
В данном методе проверяется механизм валидации. Через объект контроллера мы можем добавить ряд ошибок к свойству ModelState. И в случае ошибок, идет обращение к представлению Create.
Если мы запустим, то тест не сработает, так как никакой валидации в методе контроллера нет. Поэтому исправим метод Create:
[HttpPost] public ActionResult Create(Computer c) { if(ModelState.IsValid) {} return View("Create"); }
Запустим тест снова. Теперь он сработает успешно, и мы можем переходить к новому тесту. Добавим в класс тестов следующий метод:
[TestMethod] public void CreatePostAction_RedirectToIndexView() { // arrange string expected = "Index"; var mock = new Mock<IRepository>(); Computer comp = new Computer(); HomeController controller = new HomeController(mock.Object); // act RedirectToRouteResult result = controller.Create(comp) as RedirectToRouteResult; // assert Assert.IsNotNull(result); Assert.AreEqual(expected, result.RouteValues["action"]); }
Тестирование переадресации делается также просто, как и тестирование представлений. Объект RedirectToRouteResult
, который представляет переадресацию,
имеет свойство RouteValues
, которое позволяет получить данные маршрута - в данном случае получаем метод и сравниваем его с ожидаемым.
И поскольку данный тест опять завершится неудачно, снова изменим метод Create:
[HttpPost] public ActionResult Create(Computer c) { if(ModelState.IsValid) { return RedirectToAction("Index"); } return View("Create"); }
Запустим еще раз тест и убедимся, что он завершился успешно. И теперь добавим третий метод тестов:
[TestMethod] public void CreatePostAction_SaveModel() { // arrange var mock = new Mock<IRepository>(); Computer comp = new Computer(); HomeController controller = new HomeController(mock.Object); // act RedirectToRouteResult result = controller.Create(comp) as RedirectToRouteResult; // assert mock.Verify(a => a.Create(comp)); mock.Verify(a => a.Save()); }
В тестах мы легко можем взять результат тестируемых методов и сравнить этот результат с определенным значением, чтобы понять, правильно ли все работает.
Но не все методы возвращают определенные значения. Некоторые методы возвращают тип void
, однако и тоже необходимо тестировать.
И чтобы протестировать подобные методы, в классе Mock определен метод Verify
.
Его синтаксис прост: mock.Verify(a=>a.Method(parameter))
, где mock - это объект Mock
, а parameter
- значение,
передаваемое в качестве параметра в метод.
В данном случае вызывается метод Create, в который передается модель для сохранения, и метод Save.
Опять же тест не сработает, поэтому изменим метод Create следующим образом:
[HttpPost] public ActionResult Create(Computer c) { if(ModelState.IsValid) { repo.Create(c); repo.Save(); return RedirectToAction("Index"); } return View("Create"); }
Запустим тест и убедимся, что он завершится успешно.
Таким образом, мы можем протестировать сохранение модели и механизм переадресации.