Teste de unidade ASP.NET Web API 2

por Tom FitzMacken

Baixar Projeto Concluído

Essas diretrizes e aplicativos demonstram como criar testes de unidade simples para seu aplicativo da API Web 2. Este tutorial mostra como incluir um projeto de teste de unidade em sua solução e escrever métodos de teste que marcar os valores retornados de um método de controlador.

Este tutorial pressupõe que você esteja familiarizado com os conceitos básicos de ASP.NET Web API. Para obter um tutorial introdutório, consulte Introdução com ASP.NET Web API 2.

Os testes de unidade neste tópico são intencionalmente limitados a cenários de dados simples. Para cenários de dados mais avançados de teste de unidade, consulte Mocking Entity Framework quando o Teste de Unidade ASP.NET Web API 2.

Versões de software usadas no tutorial

Neste tópico

Este tópico contém as seguintes seções:

Pré-requisitos

Visual Studio 2017 Community, Professional ou Enterprise Edition

Código de download

Baixe o projeto concluído. O projeto baixável inclui o código de teste de unidade para este tópico e para o tópico Mocking Entity Framework quando o Teste de Unidade ASP.NET Web API tópico.

Criar aplicativo com projeto de teste de unidade

Você pode criar um projeto de teste de unidade ao criar seu aplicativo ou adicionar um projeto de teste de unidade a um aplicativo existente. Este tutorial mostra os dois métodos para criar um projeto de teste de unidade. Para seguir este tutorial, você pode usar qualquer abordagem.

Adicionar projeto de teste de unidade ao criar o aplicativo

Crie um novo aplicativo Web ASP.NET chamado StoreApp.

criar projeto

Nas janelas Novo projeto ASP.NET, selecione o modelo Vazio e adicione pastas e referências principais para a API Web. Selecione a opção Adicionar testes de unidade . O projeto de teste de unidade é chamado automaticamente de StoreApp.Tests. Você pode manter esse nome.

criar projeto de teste de unidade

Depois de criar o aplicativo, você verá que ele contém dois projetos.

dois projetos

Adicionar projeto de teste de unidade a um aplicativo existente

Se você não criou o projeto de teste de unidade ao criar seu aplicativo, poderá adicionar um a qualquer momento. Por exemplo, suponha que você já tenha um aplicativo chamado StoreApp e queira adicionar testes de unidade. Para adicionar um projeto de teste de unidade, clique com o botão direito do mouse em sua solução e selecione Adicionar e Novo Projeto.

adicionar novo projeto à solução

Selecione Testar no painel esquerdo e selecione Projeto de Teste de Unidade para o tipo de projeto. Nomeie o projeto StoreApp.Tests.

adicionar projeto de teste de unidade

Você verá o projeto de teste de unidade em sua solução.

No projeto de teste de unidade, adicione uma referência de projeto ao projeto original.

Configurar o aplicativo da API Web 2

Em seu projeto StoreApp, adicione um arquivo de classe à pasta Modelos chamada Product.cs. Substitua o conteúdo do arquivo pelo código a seguir.

using System;

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

Compile a solução.

Clique com o botão direito do mouse na pasta Controladores e selecione Adicionar e Novo Item Scaffolded. Selecione Controlador da API Web 2 – Vazio.

adicionar novo controlador

Defina o nome do controlador como SimpleProductController e clique em Adicionar.

especificar controlador

Substitua o código existente pelo código a seguir. Para simplificar este exemplo, os dados são armazenados em uma lista em vez de um banco de dados. A lista definida nessa classe representa os dados de produção. Observe que o controlador inclui um construtor que usa como parâmetro uma lista de objetos Product. Esse construtor permite que você passe dados de teste durante o teste de unidade. O controlador também inclui dois métodos assíncronos para ilustrar métodos assíncronos de teste de unidade. Esses métodos assíncronos foram implementados chamando Task.FromResult para minimizar o código desnecessário, mas normalmente os métodos incluiriam operações com uso intensivo de recursos.

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));
        }
    }
}

O método GetProduct retorna uma instância da interface IHttpActionResult . IHttpActionResult é um dos novos recursos da API Web 2 e simplifica o desenvolvimento de teste de unidade. Classes que implementam a interface IHttpActionResult são encontradas no namespace System.Web.Http.Results . Essas classes representam possíveis respostas de uma solicitação de ação e correspondem a códigos de status HTTP.

Compile a solução.

Agora você está pronto para configurar o projeto de teste.

Instalar pacotes NuGet no projeto de teste

Quando você usa o modelo Vazio para criar um aplicativo, o projeto de teste de unidade (StoreApp.Tests) não inclui nenhum pacote NuGet instalado. Outros modelos, como o modelo de API Web, incluem alguns pacotes NuGet no projeto de teste de unidade. Para este tutorial, você deve incluir o pacote Microsoft ASP.NET Web API 2 Core para o projeto de teste.

Clique com o botão direito do mouse no projeto StoreApp.Tests e selecione Gerenciar Pacotes NuGet. Você deve selecionar o projeto StoreApp.Tests para adicionar os pacotes a esse projeto.

gerenciar pacotes

Localize e instale o pacote Do Microsoft ASP.NET Web API 2 Core.

instalar o pacote principal da API Web

Feche a janela Gerenciar Pacotes NuGet.

Criar testes

Por padrão, seu projeto de teste inclui um arquivo de teste vazio chamado UnitTest1.cs. Esse arquivo mostra os atributos que você usa para criar métodos de teste. Para seus testes de unidade, você pode usar esse arquivo ou criar seu próprio arquivo.

Unittest1

Para este tutorial, você criará sua própria classe de teste. Você pode excluir o arquivo UnitTest1.cs. Adicione uma classe chamada TestSimpleProductController.cs e substitua o código pelo código a seguir.

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;
        }
    }
}

Executar testes

Agora você está pronto para executar os testes. Todo o método marcado com o atributo TestMethod será testado. No item de menu Teste , execute os testes.

executar testes

Abra a janela Testar Explorer e observe os resultados dos testes.

resultados de testes

Resumo

Você concluiu este tutorial. Os dados neste tutorial foram simplificados intencionalmente para se concentrar em condições de teste de unidade. Para cenários de dados mais avançados de teste de unidade, consulte Simulando o Entity Framework quando o Teste de Unidade ASP.NET Web API 2.