Freigeben über


Komponententests ASP.NET Web-API 2

von Tom FitzMacken

Abgeschlossenes Projekt herunterladen

Diese Anleitung und Anwendung veranschaulichen, wie Sie einfache Komponententests für Ihre Web-API 2-Anwendung erstellen. In diesem Lernprogramm wird gezeigt, wie Sie ein Komponententestprojekt in Ihre Projektmappe einbeziehen und Testmethoden schreiben, mit denen die zurückgegebenen Werte aus einer Controllermethode überprüft werden.

In diesem Lernprogramm wird davon ausgegangen, dass Sie mit den grundlegenden Konzepten ASP.NET Web-API vertraut sind. Ein einführendes Lernprogramm finden Sie unter "Erste Schritte mit ASP.NET Web-API 2".

Die Komponententests in diesem Thema sind absichtlich auf einfache Datenszenarien beschränkt. Für Komponententests fortgeschrittener Daten-Szenarien siehe Mocking Entity Framework when Unit Testing ASP.NET Web API 2.

Im Lernprogramm verwendete Softwareversionen

In diesem Thema

Dieses Thema enthält folgende Abschnitte:

Voraussetzungen

Visual Studio 2017 Community-, Professional- oder Enterprise-Edition

Code herunterladen

Laden Sie das fertige Projekt herunter. Das herunterladbare Projekt enthält Modultestcode sowohl für dieses Thema als auch für das Thema Mocking des Entity Frameworks beim Unit Testing einer ASP.NET Web-API.

Erstellen einer Anwendung mit Komponententestprojekt

Sie können entweder ein Komponententestprojekt erstellen, wenn Sie Ihre Anwendung erstellen oder einer vorhandenen Anwendung ein Komponententestprojekt hinzufügen. In diesem Lernprogramm werden beide Methoden zum Erstellen eines Komponententestprojekts gezeigt. Um diesem Lernprogramm zu folgen, können Sie beide Methoden verwenden.

Hinzufügen eines Komponententestprojekts beim Erstellen der Anwendung

Erstellen Sie eine neue ASP.NET Webanwendung mit dem Namen StoreApp.

Projekt erstellen

Wählen Sie in den Fenstern "Neu ASP.NET Projekt" die Vorlage "Leer " aus, und fügen Sie Ordner und Kernverweise für die Web-API hinzu. Wählen Sie die Option " Komponententests hinzufügen " aus. Das Komponententestprojekt heißt automatisch "StoreApp.Tests". Sie können diesen Namen beibehalten.

Erstellen eines Komponententestprojekts

Nach dem Erstellen der Anwendung sehen Sie, dass sie zwei Projekte enthält.

zwei Projekte

Hinzufügen eines Komponententestprojekts zu einer vorhandenen Anwendung

Wenn Sie das Komponententestprojekt beim Erstellen der Anwendung nicht erstellt haben, können Sie es jederzeit hinzufügen. Angenommen, Sie verfügen bereits über eine Anwendung mit dem Namen StoreApp und möchten Komponententests hinzufügen. Um ein Unittestprojekt hinzuzufügen, klicken Sie mit der rechten Maustaste auf Ihre Projektmappe und wählen Sie Hinzufügen und Neues Projekt.

Hinzufügen eines neuen Projekts zur Projektmappe

Wählen Sie im linken Bereich "Testen" und dann "Komponententestprojekt " für den Projekttyp aus. Nennen Sie das Projekt "StoreApp.Tests".

Komponententestprojekt hinzufügen

Das Komponententestprojekt wird in Ihrer Projektmappe angezeigt.

Fügen Sie im Komponententestprojekt einen Projektverweis zum ursprünglichen Projekt hinzu.

Einrichten der Web-API 2-Anwendung

Fügen Sie in Ihrem StoreApp-Projekt dem Ordner "Modelle" eine Klassendatei mit dem Namen Product.cs hinzu. Ersetzen Sie den Inhalt der Datei durch den folgenden Code.

using System;

namespace StoreApp.Models
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
    }
}

Erstellen Sie die Lösung.

Klicken Sie mit der rechten Maustaste auf den Ordner "Controller", und wählen Sie "Neues Gerüstelementhinzufügen" aus. Wählen Sie Web-API 2-Controller aus – leer.

neuen Controller hinzufügen

Legen Sie den Controllernamen auf "SimpleProductController" fest, und klicken Sie auf "Hinzufügen".

Controller angeben

Ersetzen Sie den vorhandenen Code durch den folgenden Code. Um dieses Beispiel zu vereinfachen, werden die Daten in einer Liste und nicht in einer Datenbank gespeichert. Die in dieser Klasse definierte Liste stellt die Produktionsdaten dar. Beachten Sie, dass der Controller einen Konstruktor enthält, der als Parameter eine Liste von Product-Objekten verwendet. Mit diesem Konstruktor können Sie Testdaten beim Unit-Test übergeben. Der Controller enthält außerdem zwei asynchrone Methoden, um das Testen asynchroner Methoden zu veranschaulichen. Diese asynchronen Methoden wurden durch Aufrufen von Task.FromResult implementiert, um zusätzlichen Code zu minimieren, aber normalerweise würden die Methoden ressourcenintensive Vorgänge enthalten.

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

Die GetProduct-Methode gibt eine Instanz der IHttpActionResult-Schnittstelle zurück. IHttpActionResult ist eines der neuen Features in Web API 2 und vereinfacht die Komponententestentwicklung. Klassen, die die IHttpActionResult-Schnittstelle implementieren, finden Sie im System.Web.Http.Results-Namespace . Diese Klassen stellen mögliche Antworten aus einer Aktionsanforderung dar und entsprechen HTTP-Statuscodes.

Erstellen Sie die Lösung.

Jetzt können Sie das Testprojekt einrichten.

Installieren von NuGet-Paketen im Testprojekt

Wenn Sie die Leere Vorlage zum Erstellen einer Anwendung verwenden, enthält das Komponententestprojekt (StoreApp.Tests) keine installierten NuGet-Pakete. Andere Vorlagen, z. B. die Web-API-Vorlage, enthalten einige NuGet-Pakete im Komponententestprojekt. In diesem Lernprogramm müssen Sie das Microsoft ASP.NET Web API 2 Core-Paket in das Testprojekt einschließen.

Klicken Sie mit der rechten Maustaste auf das Projekt "StoreApp.Tests", und wählen Sie "NuGet-Pakete verwalten" aus. Sie müssen das Projekt StoreApp.Tests auswählen, um dem Projekt die Pakete hinzuzufügen.

Verwalten von Paketen

Suchen und installieren Sie das Microsoft ASP.NET Web API 2 Core-Paket.

Installieren des Web-API-Kernpakets

Schließen Sie das Fenster "NuGet-Pakete verwalten".

Erstellen von Tests

Ihr Testprojekt enthält standardmäßig eine leere Testdatei mit dem Namen UnitTest1.cs. Diese Datei zeigt die Attribute an, die Sie zum Erstellen von Testmethoden verwenden. Bei Komponententests können Sie entweder diese Datei verwenden oder eine eigene Datei erstellen.

UnitTest1

In diesem Tutorial erstellen Sie Ihre eigene Testklasse. Sie können die UnitTest1.cs Datei löschen. Fügen Sie eine Klasse mit dem Namen TestSimpleProductController.cs hinzu, und ersetzen Sie den Code durch den folgenden Code.

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

Tests ausführen

Jetzt können Sie die Tests ausführen. Alle Methoden, die mit dem TestMethod-Attribut gekennzeichnet sind, werden getestet. Führen Sie im Menüelement "Test " die Tests aus.

Ausführen von Tests

Öffnen Sie das Fenster "Test-Explorer ", und beachten Sie die Ergebnisse der Tests.

Testergebnisse

Zusammenfassung

Sie haben dieses Lernprogramm abgeschlossen. Die Daten in diesem Lernprogramm wurden absichtlich vereinfacht, um sich auf Komponententests zu konzentrieren. Für Komponententests fortgeschrittener Daten-Szenarien siehe Mocking Entity Framework when Unit Testing ASP.NET Web API 2.