Модульное тестирование веб-API ASP.NET 2

; автор — Том ФитцМакен (Tom FitzMacken)

Скачивание завершенного проекта

В этом руководстве и приложении показано, как создавать простые модульные тесты для приложения веб-API 2. В этом руководстве показано, как включить проект модульного теста в решение и написать методы тестирования, которые проверка значения, возвращаемые методом контроллера.

В этом руководстве предполагается, что вы знакомы с основными понятиями веб-API ASP.NET. Вводное руководство см. в разделе начало работы с веб-API ASP.NET 2.

Модульные тесты в этом разделе намеренно ограничиваются простыми сценариями данных. Дополнительные сведения о сценариях модульного тестирования см. в статье Макетирование Entity Framework при модульного тестирования веб-API ASP.NET 2.

Версии программного обеспечения, используемые в этом руководстве

В этом разделе

Этот раздел состоит из следующих подразделов.

Предварительные требования

Visual Studio 2017 Выпуск Community, Professional или Enterprise

Скачать код

Скачайте готовый проект. Загружаемый проект содержит код модульного теста для этого раздела и макета Entity Framework, когда модульное тестирование веб-API ASP.NET.

Создание приложения с проектом модульного теста

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

Добавление проекта модульного теста при создании приложения

Создайте веб-приложение ASP.NET с именем StoreApp.

создание проекта

В окне Создать ASP.NET Проект выберите пустой шаблон и добавьте папки и основные ссылки для веб-API. Выберите параметр Добавить модульные тесты . Проект модульного теста автоматически называется StoreApp.Tests. Это имя можно сохранить.

Создание проекта модульного теста

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

два проекта

Добавление проекта модульного теста в существующее приложение

Если вы не создали проект модульного теста при создании приложения, его можно добавить в любое время. Например, предположим, что у вас уже есть приложение с именем StoreApp и вы хотите добавить модульные тесты. Чтобы добавить проект модульного теста, щелкните правой кнопкой мыши решение и выберите Добавить и Новый проект.

Добавление нового проекта в решение

Выберите Тест в области слева и выберите Проект модульного тестирования для типа проекта. Назовите проект StoreApp.Tests.

Добавление проекта модульного теста

Вы увидите проект модульного теста в решении.

В проекте модульного теста добавьте ссылку на исходный проект.

Настройка приложения веб-API 2

В проекте StoreApp добавьте файл класса в папку Modelsс именем Product.cs. Замените содержимое файла на код, приведенный ниже.

using System;

namespace StoreApp.Models
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
    }
}

Создайте решение.

Щелкните правой кнопкой мыши папку Контроллеры и выберите Добавить и Создать шаблонный элемент. Выберите Контроллер веб-API 2 — пустой.

Добавление нового контроллера

Задайте имя контроллера SimpleProductController и нажмите кнопку Добавить.

указание контроллера

Замените существующий код следующим кодом: Чтобы упростить этот пример, данные хранятся в списке, а не в базе данных. Список, определенный в этом классе, представляет рабочие данные. Обратите внимание, что контроллер включает конструктор, который принимает в качестве параметра список объектов Product. Этот конструктор позволяет передавать тестовые данные при модульной проверке. Контроллер также включает два асинхронных метода для демонстрации асинхронных методов модульного тестирования. Эти асинхронные методы были реализованы путем вызова Task.FromResult , чтобы свести к минимуму лишний код, но обычно методы включают ресурсоемкие операции.

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 — это одна из новых функций веб-API 2, упрощая разработку модульных тестов. Классы, реализующие интерфейс IHttpActionResult, находятся в пространстве имен System.Web.Http.Results . Эти классы представляют возможные ответы от запроса на действие и соответствуют кодам состояния HTTP.

Создайте решение.

Теперь все готово для настройки тестового проекта.

Установка пакетов NuGet в тестовом проекте

При использовании пустого шаблона для создания приложения проект модульного теста (StoreApp.Tests) не включает установленные пакеты NuGet. Другие шаблоны, например шаблон веб-API, включают некоторые пакеты NuGet в проект модульного теста. Для работы с этим руководством необходимо включить пакет Microsoft веб-API ASP.NET 2 Core в тестовый проект.

Щелкните правой кнопкой мыши проект StoreApp.Tests и выберите Управление пакетами NuGet. Чтобы добавить пакеты в этот проект, необходимо выбрать проект StoreApp.Tests.

управление пакетами

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

установка основного пакета веб-API

Закройте окно Управление пакетами NuGet.

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

По умолчанию тестовый проект содержит пустой файл теста с именем UnitTest1.cs. В этом файле показаны атрибуты, используемые для создания методов тестирования. Для модульных тестов можно использовать этот файл или создать собственный файл.

UnitTest1

В этом руководстве вы создадите собственный тестовый класс. Вы можете удалить файл UnitTest1.cs. Добавьте класс с именем TestSimpleProductController.cs и замените код следующим кодом.

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 , будут протестированы. В пункте меню Тест запустите тесты.

выполнение тестов

Откройте окно Тест Обозреватель и обратите внимание на результаты тестов.

Результаты тестирования

Итоги

Учебник успешно пройден. Данные в этом руководстве были намеренно упрощены, чтобы сосредоточиться на условиях модульного тестирования. Более сложные сценарии модульного тестирования см. в статье Макетирование Entity Framework при модульной проверке веб-API ASP.NET 2.