Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Возьмем тот же проект из прошлый темы (либо создадим новый) и добавим в главный проект веб-приложения в папку Contollers новый контроллер StoreController:
public class StoreController : Controller { public ActionResult Index() { ViewBag.Message = "Hello world!"; return View(); } }
Контроллер имеет только один метод, который устанавливает свойство ViewBag.Message и генерирует объект ActionResult. А также добавим для метода Index представление.
Теперь перейдем к проекту тестов и добавим в него новый класс тестов. Для этого мы можем добавить либо стандартный класс, либо использовать специальный шаблон файлов. Для этого в проекте тестов нажмем правой кнопкой мыши на каталог Controllers и в появившемся контекстном меню выберем Add->Unit Test...:
По умолчанию добавляет класс 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.
Хотя у нас только один метод в контроллере, для него мы создали три тестовых метода для теста каждого отдельного тестового действия. Подобная изоляция облегчает тестирования отдельных участков кода.
Перед запуском тестов перестроим главный проект. И запустим тесты. В этом случае мы увидим, что один тест не пройден - тот, который верифицирует представление:
Тест не пройден, потому что при вызове метода 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 из пространства имен 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
Используя эти методы, мы можем проверить различные ситуации в своем приложении.