Создание юнит-тестов

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

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

Возьмем тот же проект из прошлый темы (либо создадим новый) и добавим в главный проект веб-приложения в папку Contollers новый контроллер StoreController:

public class StoreController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Hello world!";
        return View();
    }
}

Контроллер имеет только один метод, который устанавливает свойство ViewBag.Message и генерирует объект ActionResult. А также добавим для метода Index представление.

Теперь перейдем к проекту тестов и добавим в него новый класс тестов. Для этого мы можем добавить либо стандартный класс, либо использовать специальный шаблон файлов. Для этого в проекте тестов нажмем правой кнопкой мыши на каталог Controllers и в появившемся контекстном меню выберем Add->Unit Test...:

Добавление тестов в проект ASP.NET MVC 5

По умолчанию добавляет класс UnitTest1. Во-первых, изменим название класса и файла на StoreControllerTest. Затем изменим следующим образом сам класс:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using UnitTestApp.Controllers;
using System.Web.Mvc;

namespace UnitTestApp.Tests.Controllers
{
    [TestClass]
    public class StoreControllerTest
    {
        [TestMethod]
        public void IndexViewResultNotNull()
        {
            StoreController controller = new StoreController();

            ViewResult result = controller.Index() as ViewResult;

            Assert.IsNotNull(result);
        }

        [TestMethod]
        public void IndexViewEqualIndexCshtml()
        {
            StoreController controller = new StoreController();

            ViewResult result = controller.Index() as ViewResult;

            Assert.AreEqual("Index", result.ViewName);
        }

        [TestMethod]
        public void IndexStringInViewbag()
        {
            StoreController controller = new StoreController();

            ViewResult result = controller.Index() as ViewResult;

            Assert.AreEqual("Hello world!", result.ViewBag.Message);
        }
    }
}

Метод IndexViewResultNotNull тестирует результат метода - возвращаемый объект ViewResult не должен иметь значение null. Метод IndexViewEqualIndexCshtml проверяет название вызываемого представления с помощью вызова Assert.AreEqual. А метод IndexStringInViewbag проверяет значение строки в свойстве ViewBag.Message.

Хотя у нас только один метод в контроллере, для него мы создали три тестовых метода для теста каждого отдельного тестового действия. Подобная изоляция облегчает тестирования отдельных участков кода.

Перед запуском тестов перестроим главный проект. И запустим тесты. В этом случае мы увидим, что один тест не пройден - тот, который верифицирует представление:

Создание юнит-тестов в ASP.NET MVC 5

Тест не пройден, потому что при вызове метода View нам надо явным образом указывать представление. Поэтому изменим метод Index в главном проекте следующим образом:

public ActionResult Index()
{
    ViewBag.Message = "Hello world!";
    return View("Index");
}

Снова запустим тесты. И теперь уже все тесты должны быть успешно пройдены.

Все три действия имеют одну и ту же секцию Arrange, и, возможно, было бы неплохо сразу установить все начальные настройки для всех методов. Для этого изменим в тестовом проекте класс StoreControllerTest следующим образом:

[TestClass]
public class StoreControllerTest
{
    private StoreController controller;
    private ViewResult result;

    [TestInitialize]
    public void SetupContext()
    {
        controller = new StoreController();
        result = controller.Index() as ViewResult;
    }

    [TestMethod]
    public void IndexViewResultNotNull()
    {
        Assert.IsNotNull(result);
    }

    [TestMethod]
    public void IndexViewEqualIndexCshtml()
    {
        Assert.AreEqual("Index", result.ViewName);
    }

    [TestMethod]
    public void IndexStringInViewbag()
    {
        Assert.AreEqual("Hello world!", result.ViewBag.Message);
    }
}

Атрибут TestInitialize позволяет задать метод, который выполняет начальную инициализацию для каждого отдельного теста. Благодаря этому код сокращен, а в тестовых методах оставлены только части Assert. Однако подобный подход надо принимать с осторожностью, так как он осложняет возможности по изменению кода. В данном случае общий контекст очень прост, но если при изменении методов будет изменяться и их контекст, то придется вносить большие изменения во всех классах тестов, а не только в отдельный метод для тестов.

Класс Assert и тестирование результата

Класс Assert из пространства имен Microsoft.VisualStudio.TestTools.UnitTesting с помощью своих статических методов позволяет верифицировать результат выполнения некоторого действия. Ранее уже было рассмотрено несколько методов, в частности, метод Assert.IsNotNull(), проверяющий, не равен ли некоторый объект значению null. Кроме того, при тестировании нам доступен еще ряд методов:

  • AreEqual(object expected, object actual): проверяет, равны ли оба объекта. Имеет различные перегруженные версии, позволяющие сравнивать различные типы объектов

  • AreEqual<T>(T expected, T actual): обобщенная версия предыдущего метода. Например, Assert.AreEqual<string>("Index", result.MasterName)

  • AreNotEqual(object expected, object actual): проверяет, не равны ли оба объекта. Тест проходит успешно, если объекты не равны

  • AreNotEqual<T>(T expected, T actual): обобщенная версия предыдущего метода

  • AreSame(object expected, object actual): проверяет, указывают ли оба объекта на один и тот же объект в памяти

  • AreNotSame(object expected, object actual): проверяет, указывают ли оба объекта на разные объекты в памяти. Если они указывают на один и тот же объект, то тест заканчивается неудачно

  • Equals(object objA, object objB): проверяет на равенство оба объекта

  • IsFalse(bool condition): проверяет, равно ли условие condition значению false

  • IsTrue(bool condition): проверяет, равно ли условие condition значению true

  • IsNull(object value): проверяет, имеет ли объект value значение null

  • IsInstanceOfType(object value, Type expectedType): проверяет, представляет ли объект value тип expectedType

Используя эти методы, мы можем проверить различные ситуации в своем приложении.

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