Pengujian Unit ASP.NET Web API 2
oleh Tom FitzMacken
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
- Visual Studio 2017
- WEB API 2
Dalam topik ini
Topik ini berisi bagian berikut:
- Prasyarat
- Mengunduh kode
- Membuat aplikasi dengan proyek pengujian unit
- Menyiapkan aplikasi Web API 2
- Menginstal paket NuGet dalam proyek pengujian
- Membuat pengujian
- Jalankan pengujian
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.
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.
Setelah membuat aplikasi, Anda akan melihatnya berisi 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.
Pilih Uji di panel kiri, dan pilih Proyek Pengujian Unit untuk jenis proyek. Beri nama proyek StoreApp.Tests.
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.
Atur nama pengontrol ke SimpleProductController, dan klik Tambahkan.
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.
Temukan dan instal paket Microsoft ASP.NET Web API 2 Core.
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.
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.
Buka jendela Test Explorer , dan perhatikan 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.