Всем привет. Технология ASP.NET набирает обороты и довольно часто автоматизаторам приходится сталкиваться с задачей написания юнит тестов для API. Поэтому, уделю немного вниманию руководству, как создать простые модульные тесты для вашего приложения Web API 2. Для этого нам понадобится Visual Studio 2013 или Visual Studio Express 2013 для Web. Пойдем по порядку и сначала создадим простое приложение.
Создание приложения с проектом для юнит тестов
Создайте новое приложение – ASP.NET Web Application и назовите его, например, StoreApp.

В окне New ASP.NET Project, выберите пустой шаблон – Empty и добавьте ссылку Web API. Также выберите опцию Add unit tests. Имя оставьте без изменения – StoreApp.Tests.

После создания приложения, можно заметить, что оно состоит с двух проектов.

Настройка приложения Web API 2
В новосозданном проекте StoreApp добавьте класс Product.cs в директорию Models. Скопируйте в нее следующий код.
|
1 2 3 4 5 6 7 8 9 10 11 |
using System; namespace StoreApp.Models { public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } } } |
Сбилдите проект.
Нажмите правой кнопкой на папке Controllers и выберите Add и New Scaffolded Item. Выберите Web API 2 Controller – Empty.

Назовите контроллер SimpleProductController и нажмите Add.

Вставьте в него следующий код. В нем для упрощения кода будем использовать коллекцию данных, а не базу данных. Контроллер включает конструктор, который в качестве параметров принимает список объектов Product. Контроллер также включает два асинхронных метода для юнит тестирования.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Web.Http; using StoreApp.Models; namespace StoreApp.Controllers { public class SimpleProductController : ApiController { List<Product> products = new List<Product>(); public SimpleProductController() { } public SimpleProductController(List<Product> products) { this.products = products; } public IEnumerable<Product> GetAllProducts() { return products; } public async Task<IEnumerable<Product>> GetAllProductsAsync() { return await Task.FromResult(GetAllProducts()); } public IHttpActionResult GetProduct(int id) { var product = products.FirstOrDefault((p) => p.Id == id); if (product == null) { return NotFound(); } return Ok(product); } public async Task<IHttpActionResult> GetProductAsync(int id) { return await Task.FromResult(GetProduct(id)); } } } |
Метод GetProduct возвращает объект интерфейса IHttpActionResult. IHttpActionResult – это новая фича в Web API 2, и она упрощает разработку юнит тестов. Классы, которые выполняют интерфейс IHttpActionResult можно найти в пространстве имен System.Web.Http.Results. Они представляют всевозможные ответы запросов, и они соответствуют определенному HTTP-коду.
Снова сбилдите приложение.
Установка пакета NuGet в тестовый проект
Если выбран пустой шаблон (Empty template) при создании проекта юнит тестов (StoreApp.Tests), то он не включает по-умолчанию установленный пакет NuGet. Нажмите правой кнопкой на проекте StoreApp.Tests и выберите Manage NuGet Packages.

Найдите и установите пакет Microsoft ASP.NET Web API 2 Core.

После установки, закройте окно. Здесь мы подошли непосредственно к написанию юнит-тестов для API.
Написание тестов
По-умолчанию, тестовый проект содержит пустой тестовый файл под названием UnitTest1.cs. Создадим новый файл TestSimpleProductController.cs, а этот удалим. Поместим следующий код:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Web.Http.Results; using Microsoft.VisualStudio.TestTools.UnitTesting; using StoreApp.Controllers; using StoreApp.Models; namespace StoreApp.Tests { [TestClass] public class TestSimpleProductController { [TestMethod] public void GetAllProducts_ShouldReturnAllProducts() { var testProducts = GetTestProducts(); var controller = new SimpleProductController(testProducts); var result = controller.GetAllProducts() as List<Product>; Assert.AreEqual(testProducts.Count, result.Count); } [TestMethod] public async Task GetAllProductsAsync_ShouldReturnAllProducts() { var testProducts = GetTestProducts(); var controller = new SimpleProductController(testProducts); var result = await controller.GetAllProductsAsync() as List<Product>; Assert.AreEqual(testProducts.Count, result.Count); } [TestMethod] public void GetProduct_ShouldReturnCorrectProduct() { var testProducts = GetTestProducts(); var controller = new SimpleProductController(testProducts); var result = controller.GetProduct(4) as OkNegotiatedContentResult<Product>; Assert.IsNotNull(result); Assert.AreEqual(testProducts[3].Name, result.Content.Name); } [TestMethod] public async Task GetProductAsync_ShouldReturnCorrectProduct() { var testProducts = GetTestProducts(); var controller = new SimpleProductController(testProducts); var result = await controller.GetProductAsync(4) as OkNegotiatedContentResult<Product>; Assert.IsNotNull(result); Assert.AreEqual(testProducts[3].Name, result.Content.Name); } [TestMethod] public void GetProduct_ShouldNotFindProduct() { var controller = new SimpleProductController(GetTestProducts()); var result = controller.GetProduct(999); Assert.IsInstanceOfType(result, typeof(NotFoundResult)); } private List<Product> GetTestProducts() { var testProducts = new List<Product>(); testProducts.Add(new Product { Id = 1, Name = "Demo1", Price = 1 }); testProducts.Add(new Product { Id = 2, Name = "Demo2", Price = 3.75M }); testProducts.Add(new Product { Id = 3, Name = "Demo3", Price = 16.99M }); testProducts.Add(new Product { Id = 4, Name = "Demo4", Price = 11.00M }); return testProducts; } } } |
Запуск тестов
Сейчас мы готовы к запуску тестов, которые имеют атрибут TestMethod. С помощью меню Test запустите все тесты.

Откройте Test Explorer и посмотрите на результат выполнения тестов.

Подписывайтесь на рассылку, чтобы быть в курсе новых статей!