Egységtesztelés ASP.NET Web API 2

készítette : Tom FitzMacken

Befejezett projekt letöltése

Ez az útmutató és alkalmazás bemutatja, hogyan hozhat létre egyszerű egységteszteket a Web API 2-alkalmazáshoz. Ez az oktatóanyag bemutatja, hogyan lehet egy egységtesztprojektet belefoglalni a megoldásba, és hogyan írhat olyan tesztmetódusokat, amelyek ellenőrzik a vezérlőmetódus által visszaadott értékeket.

Ez az oktatóanyag feltételezi, hogy ismeri ASP.NET Webes API alapfogalmait. Bevezető oktatóanyagért tekintse meg a ASP.NET Web API 2 használatának első lépéseit.

A jelen témakörben szereplő egységtesztek szándékosan egyszerű adatforgatókönyvekre korlátozódnak. A speciálisabb adatforgatókönyvek egységtesztelésével kapcsolatban lásd: Mocking Entity Framework when Unit Testing ASP.NET Web API 2.

Az oktatóanyagban használt szoftververziók

Ebben a témakörben

Ez a témakör alábbi részeket tartalmazza:

Előfeltételek

Visual Studio 2017 Community, Professional vagy Enterprise kiadás

Kód letöltése

Töltse le a befejezett projektet. A letölthető projekt tartalmazza a témakör egységtesztelési kódját, valamint a Mocking Entity Frameworkt a Unit Testing ASP.NET Web API-témakörhöz .

Alkalmazás létrehozása egységtesztelési projekttel

Létrehozhat egy egységtesztelési projektet az alkalmazás létrehozásakor, vagy hozzáadhat egy egységtesztelési projektet egy meglévő alkalmazáshoz. Ez az oktatóanyag az egységtesztelési projekt létrehozásának mindkét módszerét bemutatja. Az oktatóanyag követéséhez bármelyik módszert használhatja.

Egységtesztelési projekt hozzáadása az alkalmazás létrehozásakor

Hozzon létre egy StoreApp nevű új ASP.NET webalkalmazást.

projekt létrehozása

Az Új ASP.NET Projektablakban válassza ki az Üres sablont, és adjon hozzá mappákat és alapvető hivatkozásokat a Webes API-hoz. Válassza az Egységtesztek hozzáadása lehetőséget. Az egységtesztelési projekt neve automatikusan StoreApp.Tests. Ezt a nevet megtarthatja.

egységtesztelési projekt létrehozása

Az alkalmazás létrehozása után látni fogja, hogy két projektet tartalmaz.

két projekt

Egységtesztelési projekt hozzáadása meglévő alkalmazáshoz

Ha az alkalmazás létrehozásakor nem hozta létre az egységteszt-projektet, bármikor hozzáadhat egyet. Tegyük fel például, hogy már rendelkezik StoreApp nevű alkalmazásával, és egységteszteket szeretne hozzáadni. Egységtesztelési projekt hozzáadásához kattintson a jobb gombbal a megoldásra, és válassza a Hozzáadás és az Új projekt lehetőséget.

új projekt hozzáadása a megoldáshoz

A bal oldali panelen válassza a Tesztelés lehetőséget, majd a projekttípushoz tartozó Unit Test Project lehetőséget. Nevezze el a storeApp.Tests projektet.

egységtesztelési projekt hozzáadása

A megoldásban megjelenik az egységtesztelési projekt.

Az egységtesztelési projektben adjon hozzá egy projekthivatkozást az eredeti projekthez.

A Web API 2 alkalmazás beállítása

A StoreApp-projektben adjon hozzá egy osztályfájlt a Product.cs nevű Models mappához. Cserélje le a fájl tartalmát a következő kódra.

using System;

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

Hozza létre a megoldást.

Kattintson a jobb gombbal a Vezérlők mappára, és válassza a Hozzáadás és az Új állványozott elem lehetőséget. Válassza a Web API 2 Vezérlő – Üres lehetőséget.

új vezérlő hozzáadása

Állítsa a vezérlő nevét SimpleProductControllerre, majd kattintson a Hozzáadás gombra.

vezérlő megadása

Cserélje le a meglévő kódot a következő kódra. A példa egyszerűsítése érdekében az adatok adatbázis helyett listában lesznek tárolva. Az ebben az osztályban definiált lista a gyártási adatokat képviseli. Figyelje meg, hogy a vezérlő tartalmaz egy konstruktort, amely paraméterként a Termékobjektumok listáját veszi fel. Ez a konstruktor lehetővé teszi a tesztelési adatok átadását egységteszteléskor. A vezérlő két aszinkron módszert is tartalmaz az egységtesztelés aszinkron módszereinek szemléltetésére. Ezek az aszinkron metódusok a Task.FromResult meghívásával lettek implementálva a felesleges kódok minimalizálása érdekében, de a metódusok általában erőforrás-igényes műveleteket tartalmaznak.

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

A GetProduct metódus az IHttpActionResult felület egy példányát adja vissza. Az IHttpActionResult a Web API 2 egyik új funkciója, és leegyszerűsíti az egységtesztek fejlesztését. Az IHttpActionResult felületet megvalósító osztályok a System.Web.Http.Results névtérben találhatók. Ezek az osztályok egy műveletkérelem lehetséges válaszait jelölik, és HTTP-állapotkódoknak felelnek meg.

Hozza létre a megoldást.

Most már készen áll a tesztprojekt beállítására.

NuGet-csomagok telepítése tesztprojektben

Amikor az Üres sablont használja egy alkalmazás létrehozásához, az egységtesztelési projekt (StoreApp.Tests) nem tartalmaz telepített NuGet-csomagokat. Más sablonok, például a Webes API-sablon, tartalmaznak néhány NuGet-csomagot az egységtesztelési projektben. Ebben az oktatóanyagban a Microsoft ASP.NET Web API 2 Core-csomagot kell belefoglalnia a tesztprojektbe.

Kattintson a jobb gombbal a StoreApp.Tests projektre, és válassza a NuGet-csomagok kezelése lehetőséget. A csomagokat a projekthez való hozzáadásához ki kell választania a StoreApp.Tests projektet.

csomagok kezelése

Keresse meg és telepítse a Microsoft ASP.NET Web API 2 Core-csomagot.

a webes API core-csomag telepítése

Zárja be a NuGet-csomagok kezelése ablakot.

Tesztek létrehozása

Alapértelmezés szerint a tesztprojekt tartalmaz egy üres, UnitTest1.cs nevű tesztfájlt. Ez a fájl a tesztelési módszerek létrehozásához használt attribútumokat jeleníti meg. Az egységtesztekhez használhatja ezt a fájlt, vagy létrehozhatja saját fájlját.

UnitTest1

Ebben az oktatóanyagban saját tesztosztályt fog létrehozni. Törölheti a UnitTest1.cs fájlt. Adjon hozzá egy TestSimpleProductController.cs nevű osztályt, és cserélje le a kódot a következő kódra.

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

Tesztek futtatása

Most már készen áll a tesztek futtatására. A TestMethod attribútummal megjelölt összes metódust tesztelni fogjuk. A Teszt menüelemből futtassa a teszteket.

tesztek futtatása

Nyissa meg a Test Explorer ablakot, és figyelje meg a tesztek eredményeit.

teszteredmények

Összefoglalás

Elvégezte ezt az oktatóanyagot. Az oktatóanyagban szereplő adatok szándékosan leegyszerűsítve az egységtesztelési feltételekre összpontosítanak. A speciálisabb adatforgatókönyvek egységtesztelésével kapcsolatban lásd: Mocking Entity Framework when Unit Testing ASP.NET Web API 2.