Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
készítette : Tom FitzMacken
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
- Visual Studio 2017
- Web API 2
Ebben a témakörben
Ez a témakör alábbi részeket tartalmazza:
- Előfeltételek
- Kód letöltése
- Alkalmazás létrehozása egységtesztelési projekttel
- A Web API 2 alkalmazás beállítása
- NuGet-csomagok telepítése tesztprojektben
- Tesztek létrehozása
- Tesztek futtatása
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.
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.
Az alkalmazás létrehozása után látni fogja, hogy két projektet tartalmaz.
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.
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.
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.
Állítsa a vezérlő nevét SimpleProductControllerre, majd kattintson a Hozzáadás gombra.
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.
Keresse meg és telepítse a Microsoft ASP.NET Web API 2 Core-csomagot.
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.
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.
Nyissa meg a Test Explorer ablakot, és figyelje meg a tesztek eredményeit.
Ö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.