Episode ini membahas kualitas kode: unit testing dengan xUnit, mocking dengan Moq, integration testing dengan WebApplicationFactory, dan static analysis dengan analyzer Roslyn serta tooling quality seperti dotnet format.

Aplikasi yang tidak diuji adalah bom waktu. Semakin besar codebase, semakin mahal biaya memperbaiki bug yang lolos ke produksi. Testing adalah jaring pengaman yang membuat kalian berani mengubah kode tanpa takut merusak yang lain.
Dalam ekosistem .NET, ekosistem testing sudah sangat matang: xUnit untuk unit testing, Moq untuk mocking, dan WebApplicationFactory untuk integration testing di level HTTP.
Episode 10 ini mengajarkan tiga lapis pengujian tersebut, ditambah static analysis dan analyzer untuk menjaga kualitas tanpa menunggu bug terjadi.
xUnit adalah framework testing paling populer di .NET. Project test dibuat terpisah dari kode aplikasi, mengikuti konvensi struktur tests:
dotnet new xunit -n Toko.Tests -o tests/Toko.Tests
dotnet add tests/Toko.Tests reference src/Toko.App
dotnet sln Toko.sln add tests/Toko.TestsPerintah dotnet add ... reference src/Toko.App menghubungkan project test ke project aplikasi yang diuji. Tanpa reference ini, test tidak bisa melihat kode yang akan diuji.
xUnit punya dua gaya: Fact untuk satu kasus spesifik, dan Theory untuk menguji banyak input dengan satu test:
public class KalkulatorTests
{
[Fact]
public void Tambah_DuaAngka_ReturnsJumlah()
{
var hasil = Kalkulator.Tambah(2, 3);
Assert.Equal(5, hasil);
}
[Theory]
[InlineData(1, 1, 2)]
[InlineData(10, 5, 15)]
[InlineData(-1, 1, 0)]
public void Tambah_BerbagaiInput_ReturnsJumlah(int a, int b, int expected)
{
Assert.Equal(expected, Kalkulator.Tambah(a, b));
}
}Jalankan semua test dengan:
dotnet testPerintah dotnet test men-build project test dan menjalankan seluruh test, menampilkan ringkasan lulus dan gagal. Nama test yang deskriptif seperti Tambah_DuaAngka_ReturnsJumlah menjadi dokumentasi perilaku yang hidup.
Unit test harus cepat dan deterministik, sehingga dependensi eksternal seperti database atau API di-mock. Moq membuat object pengganti yang perilakunya bisa diatur:
public interface IRepository
{
Task<Produk> GetByIdAsync(int id);
}
[Fact]
public async Task GetProduk_ProdukDitemukan_ReturnsProduk()
{
var mockRepo = new Mock<IRepository>();
mockRepo.Setup(r => r.GetByIdAsync(1))
.ReturnsAsync(new Produk { Id = 1, Nama = "Kopi" });
var service = new ProdukService(mockRepo.Object);
var hasil = await service.GetProduk(1);
Assert.Equal("Kopi", hasil.Nama);
}mockRepo.Setup(r => r.GetByIdAsync(1)) menentukan jawaban saat method dipanggil. Dengan mock, kalian menguji logika ProdukService tanpa benar-benar menyentuh database.
Integration test menjalankan aplikasi web sungguhan dalam proses dan mengirim permintaan HTTP nyata. WebApplicationFactory menyediakan HttpClient yang terhubung ke aplikasi:
public class ProdukApiTests : IClassFixture<WebApplicationFactory<Program>>
{
private readonly HttpClient _client;
public ProdukApiTests(WebApplicationFactory<Program> factory)
{
_client = factory.CreateClient();
}
[Fact]
public async Task GetProduk_ReturnsOk()
{
var response = await _client.GetAsync("/api/produk/1");
response.EnsureSuccessStatusCode();
}
}Integration test ini membuktikan bahwa routing, dependency injection, dan pipeline HTTP bekerja bersama. Untuk database dalam test, ganti provider dengan SQLite atau container test.
Roslyn analyzers mendeteksi masalah pola di kode saat menulis, bukan saat runtime. Beberapa analyzer bawaan SDK aktif secara default. Jalankan pemeriksaan kualitas:
dotnet format
dotnet format --verify-no-changes
dotnet build -warnaserrorPerintah dotnet format merapikan gaya kode sesuai konfigurasi, sedangkan --verify-no-changes memastikan kode sudah rapi — sangat berguna di CI. Untuk analisis lebih dalam, project seperti SonarQube mengombinasikan analyzer, coverage, dan deteksi duplikasi di pipeline.
Inti yang harus dibawa pulang:
Fact dan Theory adalah dasar unit testing .NET.WebApplicationFactory menguji seluruh stack HTTP termasuk DI dan routing.dotnet test menjalankan semua test dan memberi ringkasan.dotnet format menjaga kualitas sejak awal.Di episode 11 selanjutnya kita masuk dunia web: web API dan HTTP client — dasar ASP.NET Core Web API, controller dan routing, model binding, HttpClient dengan typed clients, serta API versioning dan standard error response.