Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Autor: Tom FitzMacken
Pobieranie ukończonego projektu
Te wskazówki i aplikacja pokazują, jak utworzyć proste testy jednostkowe dla aplikacji internetowego interfejsu API 2. W tym samouczku pokazano, jak uwzględnić projekt testu jednostkowego w rozwiązaniu i napisać metody testów sprawdzające zwrócone wartości z metody kontrolera.
W tym samouczku założono, że znasz podstawowe pojęcia dotyczące internetowego interfejsu API ASP.NET. Aby zapoznać się z samouczkiem wprowadzającym, zobacz Getting Started with ASP.NET Web API 2 (Wprowadzenie do internetowego interfejsu API 2).
Testy jednostkowe w tym temacie są celowo ograniczone do prostych scenariuszy danych. Aby przetestować bardziej zaawansowane scenariusze danych, zobacz Mockowanie Entity Framework przy testowaniu jednostkowym w ASP.NET Web API 2.
Wersje oprogramowania używane w samouczku
- Visual Studio 2017
- Web API 2
W tym temacie
Ten temat zawiera następujące sekcje:
- Prerequisites
- Pobierz kod
- Tworzenie aplikacji przy użyciu projektu testów jednostkowych
- Konfigurowanie aplikacji Web API 2
- Instalowanie pakietów NuGet w projekcie testowym
- Tworzenie testów
- Uruchamianie testów
Wymagania wstępne
Visual Studio 2017 Wersja Community, Professional lub Enterprise
Pobierz kod
Pobierz ukończony projekt. Projekt do pobrania zawiera kod testów jednostkowych dla tego tematu i dla tematu Mocking Entity Framework podczas testowania jednostkowego ASP.NET Web API.
Tworzenie aplikacji przy użyciu projektu testów jednostkowych
Projekt testu jednostkowego można utworzyć podczas tworzenia aplikacji lub dodać projekt testu jednostkowego do istniejącej aplikacji. W tym samouczku przedstawiono obie metody tworzenia projektu testów jednostkowych. Aby wykonać czynności opisane w tym samouczku, możesz użyć jednej z tych metod.
Dodawanie projektu testów jednostkowych podczas tworzenia aplikacji
Utwórz nową aplikację internetową ASP.NET o nazwie StoreApp.
W oknach Nowy Projekt ASP.NET wybierz szablon Pusty i dodaj foldery oraz podstawowe odwołania dla interfejsu API sieci Web. Wybierz opcję Dodaj testy jednostkowe . Projekt testu jednostkowego ma automatycznie nazwę StoreApp.Tests. Możesz zachować tę nazwę.
Po utworzeniu aplikacji zobaczysz, że zawiera ona dwa projekty.
Dodawanie projektu testów jednostkowych do istniejącej aplikacji
Jeśli nie utworzono projektu testów jednostkowych podczas tworzenia aplikacji, możesz dodać go w dowolnym momencie. Załóżmy na przykład, że masz już aplikację o nazwie StoreApp i chcesz dodać testy jednostkowe. Aby dodać projekt testu jednostkowego, kliknij rozwiązanie prawym przyciskiem myszy i wybierz polecenie Dodaj i nowy projekt.
Wybierz pozycję Test w okienku po lewej stronie, a następnie wybierz pozycję Projekt testu jednostkowego dla typu projektu. Nadaj projektowi nazwę StoreApp.Tests.
W rozwiązaniu zostanie wyświetlony projekt testu jednostkowego.
W projekcie testów jednostkowych dodaj odwołanie do projektu oryginalnego.
Konfigurowanie aplikacji internetowego interfejsu API 2
W projekcie StoreApp dodaj plik klasy do folderu Models o nazwie Product.cs. Zastąp zawartość pliku następującym kodem.
using System;
namespace StoreApp.Models
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
}
Stwórz rozwiązanie.
Kliknij prawym przyciskiem myszy folder Kontrolery i wybierz polecenie Dodaj i Nowy Element Szkieletowy. Wybierz Web API 2 Kontroler - Pusty.
Ustaw nazwę kontrolera na SimpleProductController, a następnie kliknij przycisk Dodaj.
Zastąp istniejący kod następującym kodem. Aby uprościć ten przykład, dane są przechowywane na liście, a nie w bazie danych. Lista zdefiniowana w tej klasie reprezentuje dane produkcyjne. Zwróć uwagę, że kontroler zawiera konstruktor, który przyjmuje jako parametr listę obiektów Product. Ten konstruktor umożliwia przekazywanie danych testowych podczas testowania jednostkowego. Kontroler zawiera również dwie metody asynchroniczne ilustrujące metody asynchroniczne testowania jednostkowego. Te metody asynchroniczne zostały zaimplementowane przez wywołanie elementu Task.FromResult w celu zminimalizowania nadmiarowego kodu, ale zwykle metody obejmują operacje intensywnie korzystające z zasobów.
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 zwraca wystąpienie interfejsu IHttpActionResult . IHttpActionResult jest jedną z nowych funkcji internetowego interfejsu API 2 i upraszcza opracowywanie testów jednostkowych. Klasy implementujące interfejs IHttpActionResult znajdują się w przestrzeni nazw System.Web.Http.Results . Te klasy reprezentują możliwe odpowiedzi z żądania akcji i odpowiadają kodom stanu HTTP.
Stwórz rozwiązanie.
Teraz możesz przystąpić do konfigurowania projektu testowego.
Instalowanie pakietów NuGet w projekcie testowym
Jeśli używasz szablonu Empty do utworzenia aplikacji, projekt testu jednostkowego (StoreApp.Tests) nie zawiera żadnych zainstalowanych pakietów NuGet. Inne szablony, takie jak szablon internetowego interfejsu API, zawierają niektóre pakiety NuGet w projekcie testów jednostkowych. Na potrzeby tego samouczka należy dołączyć pakiet Microsoft ASP.NET Web API 2 Core do projektu testowego.
Kliknij prawym przyciskiem myszy projekt StoreApp.Tests i wybierz pozycję Zarządzaj pakietami NuGet. Musisz wybrać projekt StoreApp.Tests, aby dodać pakiety do tego projektu.
Znajdź i zainstaluj pakiet Microsoft ASP.NET Web API 2 Core.
Zamknij okno Zarządzanie pakietami NuGet.
Tworzenie testów
Domyślnie projekt testowy zawiera pusty plik testowy o nazwie UnitTest1.cs. Ten plik przedstawia atrybuty używane do tworzenia metod testowych. W przypadku testów jednostkowych możesz użyć tego pliku lub utworzyć własny plik.
Na potrzeby tego samouczka utworzysz własną klasę testowa. Możesz usunąć plik UnitTest1.cs. Dodaj klasę o nazwie TestSimpleProductController.cs i zastąp kod następującym kodem.
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;
}
}
}
Uruchamianie testów
Teraz możesz uruchomić testy. Wszystkie metody oznaczone atrybutem TestMethod zostaną przetestowane. W elemencie menu Test uruchom testy.
Otwórz okno Eksplorator testów i zwróć uwagę na wyniki testów.
Podsumowanie
Ukończyłeś ten samouczek. Dane w samouczku zostały celowo uproszczone, aby skoncentrować się na warunkach testowania jednostkowego. Aby przetestować bardziej zaawansowane scenariusze danych, zobacz Mockowanie Entity Framework przy testowaniu jednostkowym w ASP.NET Web API 2.