Birim Testi ASP.NET Web API 2

yazan: Tom FitzMacken

Tamamlanan Projeyi İndir

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

Bu konuda

Bu konu aşağıdaki bölümleri içermektedir:

Ö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.

proje oluşturma

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.

birim testi projesi oluşturma

Uygulamayı oluşturduktan sonra iki proje içerdiğini göreceksiniz.

iki proje

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.

çözüme yeni proje ekleme

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 projesi ekleme

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.

yeni denetleyici ekle

Denetleyici adını SimpleProductController olarak ayarlayın ve Ekle'ye tıklayın.

denetleyici belirtme

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.

paketleri yönetme

Microsoft ASP.NET Web API 2 Core paketini bulun ve yükleyin.

web api çekirdek paketini yükleme

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.

UnitTest1

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.

testleri çalıştırma

Test Gezgini penceresini açın ve testlerin sonuçlarına dikkat edin.

test sonuçları

Ö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.