Testování částí ASP.NET webového rozhraní API 2

Tom FitzMacken

Stáhnout dokončený projekt

Tyto pokyny a aplikace ukazují, jak vytvořit jednoduché testy jednotek pro vaši 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 webového rozhraní API ASP.NET. Úvodní kurz najdete v tématu Začínáme s ASP.NET webovým rozhraním API 2.

Testy jednotek v tomto tématu jsou záměrně omezené na jednoduché datové scénáře. Pokročilejší scénáře testování jednotek najdete v tématu Napodobování Entity Frameworku při testování jednotek ASP.NET webovém rozhraní API 2.

Verze softwaru používané v tomto kurzu

V tomto tématu

Toto téma obsahuje následující části:

Předpoklady

Visual Studio 2017 Community, Professional nebo Enterprise Edition

Stažení kódu

Stáhněte dokončený projekt. Projekt ke stažení obsahuje jednotkové testy pro toto téma a pro mockování Entity Framework při jednotkovém testování ASP.NET Web API téma.

Vytvoření aplikace s projektem testování jednotek

Projekt testování jednotek můžete vytvořit při vytváření aplikace nebo přidat projekt testu jednotek do existující aplikace. Tento kurz ukazuje oba způsoby, jak vytvořit projekt testování jednotek. Pokud chcete postupovat podle tohoto kurzu, můžete použít některý z těchto přístupů.

Přidání projektu testování jednotek při vytváření aplikace

Vytvořte novou ASP.NET webovou aplikaci s názvem StoreApp.

vytvoření projektu

V oknech Nový ASP.NET Projectu vyberte prázdnou šablonu a přidejte složky a základní odkazy pro webové rozhraní API. Vyberte možnost Přidat testy jednotek . Projekt jednotkových testů se automaticky jmenuje StoreApp.Tests. Tento název můžete zachovat.

vytvoření projektu testování jednotek

Po vytvoření aplikace uvidíte, že obsahuje dva projekty.

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í jednotek, klikněte pravým tlačítkem na řešení a vyberte Přidat a nový projekt.

Přidání nového projektu do řešení

V levém podokně vyberte Test a jako typ projektu vyberte Projekt testování jednotek . Pojmenujte projekt StoreApp.Tests.

přidat projekt jednotkových testů

V řešení se zobrazí projekt testu jednotek.

V projektu testování jednotek přidejte odkaz na projekt do původního projektu.

Nastavení aplikace webového rozhraní API 2

V projektu StoreApp přidejte soubor třídy do složky Models s 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 myši na složku Kontrolery a vyberte Přidat a nová vygenerovaná položka. Vyberte kontroler webového rozhraní API 2 – prázdný.

přidání nového kontroleru

Nastavte název kontroleru na SimpleProductController a klepněte na tlačítko Přidat.

zadat řadič

Nahraďte stávající kód následujícím kódem. Pro zjednodušení tohoto příkladu se data ukládají 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 obsahuje také dvě asynchronní metody pro ilustraci asynchronních metod testování jednotek. Tyto asynchronní metody byly implementovány voláním Task.FromResult k minimalizaci nadbytečného kódu, ale obvykle 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 IHttpActionResult rozhraní. 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 jsou nalezeny v System.Web.Http.Results oboru názvů. Tyto třídy představují možné odpovědi z požadavku akce a odpovídají stavovým kódům 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 testů jednotek (StoreApp.Tests) neobsahuje žádné nainstalované balíčky NuGet. Mezi další šablony, jako je šablona webového rozhraní API, patří 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 do projektu přidat balíčky, musíte vybrat projekt StoreApp.Tests.

správa balíčků

Vyhledejte a nainstalujte balíček Microsoft ASP.NET Web API 2 Core.

Instalace balíčku Jádra webového rozhraní API

Zavřete okno Spravovat balíčky NuGet.

Vytváření testů

Ve výchozím nastavení projekt testu 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 použít tento soubor nebo vytvořit vlastní soubor.

UnitTest1

Pro účely tohoto kurzu vytvoříte vlastní testovací třídu. Soubor UnitTest1.cs můžete odstranit. 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. Testuje se všechna metoda označená atributem TestMethod . Z položky nabídky Test spusťte testy.

spouštění testů

Otevřete okno Průzkumníka testů a všimněte si výsledků testů.

výsledky testu

Shrnutí

Dokončili jste tento kurz. Data v tomto kurzu byla záměrně zjednodušena tak, aby se zaměřila na podmínky testování jednotek. Pokročilejší scénáře testování jednotek najdete v tématu Napodobování Entity Frameworku při testování jednotek ASP.NET webovém rozhraní API 2.