Тестирование создания модели и переадресации

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Рассмотрим на примере тестирование создания модели и переадресации. Во-первых, нам нужен минимальный код для запуска тестов. Для этого возьмем проект веб-приложения из прошлой темы и определим в нем стандартный метод 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");
}

Запустим тест и убедимся, что он завершится успешно.

Таким образом, мы можем протестировать сохранение модели и механизм переадресации.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850