Teste de unidade ASP.NET Web API 2
por Tom FitzMacken
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
- Visual Studio 2017
- API Web 2
Neste tópico
Este tópico contém as seguintes seções:
- Pré-requisitos
- Código de download
- Criar aplicativo com projeto de teste de unidade
- Configurar o aplicativo da API Web 2
- Instalar pacotes NuGet no projeto de teste
- Criar testes
- Executar testes
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.
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.
Depois de criar o aplicativo, você verá que ele contém 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.
Selecione Testar no painel esquerdo e selecione Projeto de Teste de Unidade para o tipo de projeto. Nomeie o projeto StoreApp.Tests.
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.
Defina o nome do controlador como SimpleProductController e clique em Adicionar.
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.
Localize e instale o pacote Do Microsoft ASP.NET Web API 2 Core.
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.
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.
Abra a janela Testar Explorer e observe os resultados dos 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.