Bagikan melalui


Pengujian Unit ASP.NET Web API 2

oleh Tom FitzMacken

Unduh Proyek yang Selesai

Panduan dan aplikasi ini menunjukkan cara membuat pengujian unit sederhana untuk aplikasi Web API 2 Anda. Tutorial ini menunjukkan cara menyertakan proyek pengujian unit dalam solusi Anda, dan menulis metode pengujian yang memeriksa nilai yang dikembalikan dari metode pengontrol.

Tutorial ini mengasumsikan Anda terbiasa dengan konsep dasar ASP.NET Web API. Untuk tutorial pengantar, lihat Memulai ASP.NET Web API 2.

Pengujian unit dalam topik ini sengaja terbatas pada skenario data sederhana. Untuk pengujian unit skenario data yang lebih canggih, lihat Meniru Kerangka Kerja Entitas saat Pengujian Unit ASP.NET Web API 2.

Versi perangkat lunak yang digunakan dalam tutorial

Dalam topik ini

Topik ini berisi bagian berikut:

Prasyarat

Visual Studio 2017 Edisi Komunitas, Profesional, atau Perusahaan

Mengunduh kode

Unduh proyek yang telah selesai. Proyek yang dapat diunduh mencakup kode pengujian unit untuk topik ini dan untuk Kerangka Kerja Entitas Mocking saat Pengujian Unit ASP.NET topik Web API .

Membuat aplikasi dengan proyek pengujian unit

Anda dapat membuat proyek pengujian unit saat membuat aplikasi atau menambahkan proyek pengujian unit ke aplikasi yang ada. Tutorial ini menunjukkan kedua metode untuk membuat proyek pengujian unit. Untuk mengikuti tutorial ini, Anda dapat menggunakan salah satu pendekatan.

Menambahkan proyek pengujian unit saat membuat aplikasi

Buat Aplikasi Web ASP.NET baru bernama StoreApp.

membuat proyek

Di jendela Proyek ASP.NET Baru, pilih templat Kosong dan tambahkan folder dan referensi inti untuk API Web. Pilih opsi Tambahkan pengujian unit . Proyek pengujian unit secara otomatis bernama StoreApp.Tests. Anda dapat menyimpan nama ini.

membuat proyek pengujian unit

Setelah membuat aplikasi, Anda akan melihatnya berisi dua proyek.

dua proyek

Menambahkan proyek pengujian unit ke aplikasi yang sudah ada

Jika Anda tidak membuat proyek pengujian unit saat membuat aplikasi, Anda dapat menambahkannya kapan saja. Misalnya, Anda sudah memiliki aplikasi bernama StoreApp, dan Anda ingin menambahkan pengujian unit. Untuk menambahkan proyek pengujian unit, klik kanan solusi Anda dan pilih Tambahkan dan Proyek Baru.

tambahkan proyek baru ke solusi

Pilih Uji di panel kiri, dan pilih Proyek Pengujian Unit untuk jenis proyek. Beri nama proyek StoreApp.Tests.

tambahkan proyek pengujian unit

Anda akan melihat proyek pengujian unit dalam solusi Anda.

Dalam proyek pengujian unit, tambahkan referensi proyek ke proyek asli.

Menyiapkan aplikasi Web API 2

Di proyek StoreApp Anda, tambahkan file kelas ke folder Model bernamaProduct.cs. Ganti isi file dengan kode berikut.

using System;

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

Bangun solusinya.

Klik kanan folder Pengontrol dan pilih Tambahkan dan Item Perancah Baru. Pilih Pengontrol WEB API 2 - Kosong.

tambahkan pengontrol baru

Atur nama pengontrol ke SimpleProductController, dan klik Tambahkan.

tentukan pengontrol

Ganti kode yang sudah ada dengan kode berikut. Untuk menyederhanakan contoh ini, data disimpan dalam daftar daripada database. Daftar yang ditentukan dalam kelas ini mewakili data produksi. Perhatikan bahwa pengontrol menyertakan konstruktor yang mengambil sebagai parameter daftar objek Produk. Konstruktor ini memungkinkan Anda untuk meneruskan data pengujian saat pengujian unit. Pengontrol juga mencakup dua metode asinkron untuk mengilustrasikan pengujian unit metode asinkron. Metode asinkron ini diimplementasikan dengan memanggil Task.FromResult untuk meminimalkan kode asing, tetapi biasanya metode akan mencakup operasi intensif sumber daya.

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

Metode GetProduct mengembalikan instans antarmuka IHttpActionResult . IHttpActionResult adalah salah satu fitur baru di Web API 2, dan menyederhanakan pengembangan pengujian unit. Kelas yang mengimplementasikan antarmuka IHttpActionResult ditemukan di namespace Layanan System.Web.Http.Results . Kelas-kelas ini mewakili kemungkinan respons dari permintaan tindakan, dan sesuai dengan kode status HTTP.

Bangun solusinya.

Anda sekarang siap untuk menyiapkan proyek pengujian.

Menginstal paket NuGet dalam proyek pengujian

Saat Anda menggunakan templat Kosong untuk membuat aplikasi, proyek pengujian unit (StoreApp.Tests) tidak menyertakan paket NuGet yang diinstal. Templat lain, seperti templat API Web, menyertakan beberapa paket NuGet dalam proyek pengujian unit. Untuk tutorial ini, Anda harus menyertakan paket Microsoft ASP.NET Web API 2 Core ke proyek pengujian.

Klik kanan proyek StoreApp.Tests dan pilih Kelola Paket NuGet. Anda harus memilih proyek StoreApp.Tests untuk menambahkan paket ke proyek tersebut.

mengelola paket

Temukan dan instal paket Microsoft ASP.NET Web API 2 Core.

menginstal paket inti api web

Tutup jendela Kelola Paket NuGet.

Membuat pengujian

Secara default, proyek pengujian Anda menyertakan file pengujian kosong bernama UnitTest1.cs. File ini menunjukkan atribut yang Anda gunakan untuk membuat metode pengujian. Untuk pengujian unit, Anda dapat menggunakan file ini atau membuat file Anda sendiri.

UnitTest1

Untuk tutorial ini, Anda akan membuat kelas pengujian Anda sendiri. Anda dapat menghapus file UnitTest1.cs. Tambahkan kelas bernama TestSimpleProductController.cs, dan ganti kode dengan kode berikut.

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

Jalankan pengujian

Anda sekarang siap untuk menjalankan tes. Semua metode yang ditandai dengan atribut TestMethod akan diuji. Dari item menu Uji , jalankan pengujian.

jalankan pengujian

Buka jendela Test Explorer , dan perhatikan hasil pengujian.

hasil pengujian

Ringkasan

Anda telah menyelesaikan tutorial ini. Data dalam tutorial ini sengaja disederhanakan untuk fokus pada kondisi pengujian unit. Untuk pengujian unit skenario data yang lebih canggih, lihat Meniru Kerangka Kerja Entitas saat Pengujian Unit ASP.NET Web API 2.