Birim Testi ASP.NET Web API 2
yazan: Tom FitzMacken
Bu kılavuz ve uygulama, Web API 2 uygulamanız için basit birim testleri oluşturmayı gösterir. Bu öğreticide, çözümünüzde birim testi projesinin nasıl dahil edildiği ve bir denetleyici yönteminden döndürülen değerleri denetleyebilen test yöntemlerinin nasıl yazıldığını gösterir.
Bu öğreticide, ASP.NET Web API'sinin temel kavramlarını bildiğiniz varsayılır. Giriş niteliğindeki bir öğretici için bkz. ASP.NET Web API 2 ile Çalışmaya Başlama.
Bu konudaki birim testleri kasıtlı olarak basit veri senaryolarıyla sınırlıdır. Daha gelişmiş veri senaryolarında birim testi için bkz. Web API 2 ASP.NET Birim Testi sırasında Sahte Varlık Çerçevesi.
Öğreticide kullanılan yazılım sürümleri
- Visual Studio 2017
- Web API 2
Bu konuda
Bu konu aşağıdaki bölümleri içermektedir:
- Önkoşullar
- Kodu indirin
- Birim testi projesiyle uygulama oluşturma
- Web API 2 uygulamasını ayarlama
- Test projesine NuGet paketlerini yükleme
- Test oluşturma
- Testleri çalıştırma
Önkoşullar
Visual Studio 2017 Community, Professional veya Enterprise sürümü
Kodu indirin
Tamamlanan projeyi indirin. İndirilebilir proje, bu konu ve Birim Testi ASP.NET Web API'sinin konusu için Sahte Varlık Çerçevesi için birim testi kodunu içerir.
Birim testi projesiyle uygulama oluşturma
Uygulamanızı oluştururken birim testi projesi oluşturabilir veya mevcut bir uygulamaya birim testi projesi ekleyebilirsiniz. Bu öğreticide, birim testi projesi oluşturmaya yönelik her iki yöntem de gösterilir. Bu öğreticiyi izlemek için her iki yaklaşımı da kullanabilirsiniz.
Uygulamayı oluştururken birim testi projesi ekleme
StoreApp adlı yeni bir ASP.NET Web Uygulaması oluşturun.
Yeni ASP.NET Projesi pencerelerinde Boş şablonu seçin ve Web API'sinin klasörlerini ve çekirdek başvurularını ekleyin. Birim testleri ekle seçeneğini belirleyin. Birim testi projesi otomatik olarak StoreApp.Tests olarak adlandırılır. Bu adı kullanabilirsiniz.
Uygulamayı oluşturduktan sonra iki proje içerdiğini göreceksiniz.
Mevcut bir uygulamaya birim testi projesi ekleme
Uygulamanızı oluştururken birim testi projesini oluşturmadıysanız istediğiniz zaman bir tane ekleyebilirsiniz. Örneğin, StoreApp adlı bir uygulamanız olduğunu ve birim testleri eklemek istediğinizi varsayalım. Birim testi projesi eklemek için çözümünüze sağ tıklayın ve Ekle ve Yeni Proje'yi seçin.
Sol bölmede Test'i seçin ve proje türü için Birim Testi Projesi'ni seçin. Projeye StoreApp.Tests adını verin.
Birim testi projesini çözümünüzde görürsünüz.
Birim testi projesinde, özgün projeye bir proje başvurusu ekleyin.
Web API 2 uygulamasını ayarlama
StoreApp projenizde, Models klasörüne Product.cs adlı bir sınıf dosyası ekleyin. Dosyanın içeriğini aşağıdaki kodla değiştirin.
using System;
namespace StoreApp.Models
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
}
Çözümü derleyin.
Denetleyiciler klasörüne sağ tıklayın ve Ekle ve Yeni İskeleli Öğe'yi seçin. Web API 2 Denetleyicisi - Boş'u seçin.
Denetleyici adını SimpleProductController olarak ayarlayın ve Ekle'ye tıklayın.
Mevcut kodu aşağıdaki kodla değiştirin. Bu örneği basitleştirmek için veriler veritabanı yerine bir listede depolanır. Bu sınıfta tanımlanan liste üretim verilerini temsil eder. Denetleyicinin Product nesnelerinin listesini parametre olarak alan bir oluşturucu içerdiğine dikkat edin. Bu oluşturucu, birim testi sırasında test verilerini geçirmenizi sağlar. Denetleyici ayrıca birim testi zaman uyumsuz yöntemlerini göstermek için iki zaman uyumsuz yöntem içerir. Bu zaman uyumsuz yöntemler, gereksiz kodu en aza indirmek için Task.FromResult çağrılarak uygulandı, ancak normalde yöntemler yoğun kaynak kullanımlı işlemleri içerebilir.
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));
}
}
}
GetProduct yöntemi , IHttpActionResult arabiriminin bir örneğini döndürür. IHttpActionResult, Web API 2'deki yeni özelliklerden biridir ve birim testi geliştirmeyi basitleştirir. IHttpActionResult arabirimini uygulayan sınıflar System.Web.Http.Results ad alanında bulunur. Bu sınıflar bir eylem isteğinden gelen olası yanıtları temsil eder ve HTTP durum kodlarına karşılık gelir.
Çözümü derleyin.
Artık test projesini ayarlamaya hazırsınız.
Test projesine NuGet paketlerini yükleme
Uygulama oluşturmak için Boş şablonunu kullandığınızda, birim testi projesi (StoreApp.Tests) yüklü NuGet paketi içermez. Web API şablonu gibi diğer şablonlar, birim testi projesinde bazı NuGet paketlerini içerir. Bu öğretici için test projesine Microsoft ASP.NET Web API 2 Core paketini eklemeniz gerekir.
StoreApp.Tests projesine sağ tıklayın ve NuGet Paketlerini Yönet'i seçin. Paketleri bu projeye eklemek için StoreApp.Tests projesini seçmeniz gerekir.
Microsoft ASP.NET Web API 2 Core paketini bulun ve yükleyin.
NuGet Paketlerini Yönet penceresini kapatın.
Test oluşturma
Varsayılan olarak, test projeniz UnitTest1.cs adlı boş bir test dosyası içerir. Bu dosya, test yöntemleri oluşturmak için kullandığınız öznitelikleri gösterir. Birim testleriniz için bu dosyayı kullanabilir veya kendi dosyanızı oluşturabilirsiniz.
Bu öğretici için kendi test sınıfınızı oluşturacaksınız. UnitTest1.cs dosyasını silebilirsiniz. TestSimpleProductController.cs adlı bir sınıf ekleyin ve kodu aşağıdaki kodla değiştirin.
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;
}
}
}
Testleri çalıştırma
Artık testleri çalıştırmaya hazırsınız. TestMethod özniteliğiyle işaretlenmiş tüm yöntem test edilir. Test menü öğesinden testleri çalıştırın.
Test Gezgini penceresini açın ve testlerin sonuçlarına dikkat edin.
Özet
Bu öğreticiyi tamamladınız. Bu öğreticideki veriler, birim testi koşullarına odaklanmak için kasıtlı olarak basitleştirilmiştir. Daha gelişmiş veri senaryolarında birim testi için bkz . Web API 2 ASP.NET Birim Testi yaparken Entity Framework'ün Sahtesini Yapma.