Testowanie jednostkowe ASP.NET internetowego interfejsu API 2

– 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 testowe, które sprawdzają 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 Wprowadzenie przy użyciu interfejsu API sieci Web ASP.NET 2.

Testy jednostkowe w tym temacie są celowo ograniczone do prostych scenariuszy danych. Aby zapoznać się z bardziej zaawansowanymi scenariuszami danych testowania jednostkowego, zobacz Mocking Entity Framework when Unit Testing ASP.NET Web API 2 (Mocking Entity Framework when Unit Testing ASP.NET Web API 2).

Wersje oprogramowania używane w samouczku

W tym temacie:

Ten temat zawiera następujące sekcje:

Wymagania wstępne

Visual Studio 2017 Community, Professional lub Enterprise edition

Pobieranie kodu

Pobierz ukończony projekt. Projekt do pobrania zawiera kod testu jednostkowego dla tego tematu oraz w temacie Pozorowanie platformy Entity Framework podczas testowania jednostkowego ASP.NET internetowym interfejsem 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.

tworzenie projektu

W oknach New ASP.NET Project (Nowy ASP.NET Project) wybierz szablon Empty (Pusty szablon) i dodaj foldery i podstawowe odwołania dla internetowego interfejsu API. Wybierz opcję Dodaj testy jednostkowe . Projekt testu jednostkowego ma automatycznie nazwę StoreApp.Tests. Możesz zachować tę nazwę.

tworzenie projektu testów jednostkowych

Po utworzeniu aplikacji zobaczysz, że zawiera ona dwa projekty.

dwa projekty

Dodawanie projektu testów jednostkowych do istniejącej aplikacji

Jeśli projekt testów jednostkowych nie został utworzony 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 testów jednostkowych, kliknij rozwiązanie prawym przyciskiem myszy i wybierz polecenie Dodaj i nowy projekt.

dodawanie nowego projektu do rozwiązania

Wybierz pozycję Test w okienku po lewej stronie i wybierz pozycję Projekt testu jednostkowego dla typu projektu. Nadaj projektowi nazwę StoreApp.Tests.

dodawanie projektu testów jednostkowych

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

Skompiluj rozwiązanie.

Kliknij prawym przyciskiem myszy folder Controllers i wybierz polecenie Dodaj i nowy element szkieletowy. Wybierz pozycję Kontroler internetowego interfejsu API 2 — pusty.

dodawanie nowego kontrolera

Ustaw nazwę kontrolera na SimpleProductController, a następnie kliknij przycisk Dodaj.

określ kontroler

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 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.

Skompiluj 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 testu jednostkowego. W tym samouczku należy dołączyć pakiet Microsoft ASP.NET Web API 2 Core do projektu testowego.

Kliknij prawym przyciskiem myszy projekt StoreApp.Tests i wybierz polecenie Zarządzaj pakietami NuGet. Musisz wybrać projekt StoreApp.Tests, aby dodać pakiety do tego projektu.

zarządzanie pakietami

Znajdź i zainstaluj pakiet Microsoft ASP.NET Web API 2 Core.

Instalowanie pakietu podstawowego interfejsu API sieci Web

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.

UnitTest1

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 poniższym 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;
        }
    }
}

Uruchom testy

Teraz możesz przystąpić do uruchamiania testów. Wszystkie metody oznaczone atrybutem TestMethod zostaną przetestowane. W elemencie menu Test uruchom testy.

uruchamianie testów

Otwórz okno Eksplorator testów i zwróć uwagę na wyniki testów.

wyniki testu

Podsumowanie

Ten samouczek został ukończony. Dane w tym samouczku zostały celowo uproszczone, aby skoncentrować się na warunkach testowania jednostkowego. Aby zapoznać się z bardziej zaawansowanymi scenariuszami danych testowania jednostkowego, zobacz Mocking Entity Framework when Unit Testing ASP.NET Web API 2 (Mocking Entity Framework when Unit Testing ASP.NET Web API 2).