Testování částí ASP.NET webové rozhraní API 2
, autor: Tom FitzMacken
Tyto doprovodné materiály a aplikace ukazují, jak vytvořit jednoduché testy jednotek pro aplikaci webového rozhraní API 2. V tomto kurzu se dozvíte, jak do řešení zahrnout projekt testování jednotek a jak napsat testovací metody, které kontrolují vrácené hodnoty z metody kontroleru.
V tomto kurzu se předpokládá, že znáte základní koncepty ASP.NET webového rozhraní API. Úvodní kurz najdete v tématu Začínáme s webovým rozhraním API ASP.NET 2.
Testy jednotek v tomto tématu jsou záměrně omezeny na scénáře jednoduchých dat. Pokročilejší scénáře testování jednotek najdete v tématu Napodobení Entity Frameworku při testování jednotek ASP.NET webovém rozhraní API 2.
Verze softwaru použité v tomto kurzu
- Visual Studio 2017
- Webové rozhraní API 2
V tomto tématu
Toto téma obsahuje následující oddíly:
- Požadavky
- Stažení kódu
- Vytvoření aplikace s projektem testování jednotek
- Nastavení aplikace Webové rozhraní API 2
- Instalace balíčků NuGet v testovacím projektu
- Vytváření testů
- Spouštění testů
Požadavky
Visual Studio 2017 Edice Community, Professional nebo Enterprise
Stažení kódu
Stáhněte si dokončený projekt. Projekt ke stažení obsahuje kód testování jednotek pro toto téma a pro téma Napodobení Entity Frameworku při testování jednotek ASP.NET webového rozhraní API .
Vytvoření aplikace s projektem testování jednotek
Při vytváření aplikace můžete buď vytvořit projekt testování částí, nebo přidat projekt testování částí do existující aplikace. Tento kurz ukazuje obě metody pro vytvoření projektu testu jednotek. Pokud chcete postupovat podle tohoto kurzu, můžete použít oba přístupy.
Přidání projektu testování jednotek při vytváření aplikace
Vytvořte novou ASP.NET webovou aplikaci s názvem StoreApp.
V oknech Nový projekt ASP.NET vyberte šablonu Prázdné a přidejte složky a základní odkazy pro webové rozhraní API. Vyberte možnost Přidat testy jednotek . Projekt testování jednotek má automaticky název StoreApp.Tests. Tento název si můžete ponechat.
Po vytvoření aplikace uvidíte, že obsahuje dva projekty.
Přidání projektu testování jednotek do existující aplikace
Pokud jste při vytváření aplikace nevytvořili projekt testování jednotek, můžete ho kdykoli přidat. Předpokládejme například, že už máte aplikaci s názvem StoreApp a chcete přidat testy jednotek. Pokud chcete přidat projekt testování částí, klikněte pravým tlačítkem na řešení a vyberte Přidat a Nový projekt.
V levém podokně vyberte Test a jako typ projektu vyberte Projekt testování částí . Projekt pojmenujte StoreApp.Tests.
V řešení uvidíte projekt testování jednotek.
V projektu testování jednotek přidejte odkaz na původní projekt.
Nastavení aplikace Webové rozhraní API 2
V projektu StoreApp přidejte soubor třídy do složky Modelss názvem Product.cs. Obsah souboru nahraďte následujícím kódem.
using System;
namespace StoreApp.Models
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
}
Sestavte řešení.
Klikněte pravým tlačítkem na složku Controllers (Kontrolery) a vyberte Add and New Scaffolded Item (Přidat a nová vygenerovaná položka). Vyberte Kontroler webového rozhraní API 2 – prázdný.
Nastavte název kontroleru na SimpleProductController a klikněte na Přidat.
Nahraďte existující kód následujícím kódem. Pro zjednodušení tohoto příkladu jsou data uložena v seznamu, nikoli v databázi. Seznam definovaný v této třídě představuje produkční data. Všimněte si, že kontroler obsahuje konstruktor, který přebírá jako parametr seznam objektů Product. Tento konstruktor umožňuje předávat testovací data při testování jednotek. Kontroler také obsahuje dvě asynchronní metody pro ilustraci asynchronních metod testování jednotek. Tyto asynchronní metody byly implementovány voláním Task.FromResult , aby se minimalizoval nadbytečný kód, ale za normálních okolností by metody zahrnovaly operace náročné na prostředky.
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));
}
}
}
Metoda GetProduct vrátí instanci rozhraní IHttpActionResult . IHttpActionResult je jednou z nových funkcí webového rozhraní API 2 a zjednodušuje vývoj testů jednotek. Třídy, které implementují rozhraní IHttpActionResult, se nacházejí v oboru názvů System.Web.Http.Results . Tyto třídy představují možné odpovědi na žádost o akci a odpovídají stavové kódy HTTP.
Sestavte řešení.
Teď jste připraveni nastavit testovací projekt.
Instalace balíčků NuGet v testovacím projektu
Pokud k vytvoření aplikace použijete prázdnou šablonu, projekt testování jednotek (StoreApp.Tests) neobsahuje žádné nainstalované balíčky NuGet. Jiné šablony, například šablona webového rozhraní API, zahrnují některé balíčky NuGet v projektu testování jednotek. Pro účely tohoto kurzu musíte do testovacího projektu zahrnout balíček Microsoft ASP.NET Web API 2 Core.
Klikněte pravým tlačítkem na projekt StoreApp.Tests a vyberte Spravovat balíčky NuGet. Chcete-li přidat balíčky do projektu, musíte vybrat projekt StoreApp.Tests.
Vyhledejte a nainstalujte balíček Microsoft ASP.NET Web API 2 Core.
Zavřete okno Spravovat balíčky NuGet.
Vytváření testů
Ve výchozím nastavení testovací projekt obsahuje prázdný testovací soubor s názvem UnitTest1.cs. Tento soubor zobrazuje atributy, které používáte k vytvoření testovacích metod. Pro testy jednotek můžete buď použít tento soubor, nebo vytvořit vlastní soubor.
Pro účely tohoto kurzu vytvoříte vlastní testovací třídu. Můžete odstranit soubor UnitTest1.cs. Přidejte třídu s názvem TestSimpleProductController.cs a nahraďte kód následujícím kódem.
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;
}
}
}
Spouštění testů
Teď jste připraveni spustit testy. Všechny metody označené atributem TestMethod budou testovány . Z položky nabídky Test spusťte testy.
Otevřete okno Průzkumníka testů a všimněte si výsledků testů.
Souhrn
Dokončili jste tento kurz. Data v tomto kurzu byla záměrně zjednodušena, aby se zaměřila na podmínky testování jednotek. Pokročilejší scénáře testování částí najdete v tématu Napodobení Entity Frameworku při testování jednotek ASP.NET webovém rozhraní API 2.