Saya sedang mengerjakan aplikasi yang memiliki banyak lapisan. Lapisan akses data untuk mengambil dan menyimpan data dari sumber data, logika bisnis untuk memanipulasi data, antarmuka pengguna untuk menampilkan data di layar.
Saya juga melakukan pengujian unit pada lapisan logika bisnis. Satu-satunya persyaratan adalah untuk menguji aliran logika lapisan bisnis. Jadi saya menggunakan kerangka kerja Moq untuk mengejek lapisan akses data dan unit menguji lapisan logika bisnis dengan MS Unit.
Saya menggunakan pemrograman antarmuka untuk membuat desain decouple sebanyak mungkin sehingga unit test dapat dilakukan. Lapisan akses data panggilan bisnis lapisan melalui antarmuka.
Saya menghadapi masalah ketika saya mencoba menguji salah satu metode logika bisnis. Metode itu melakukan beberapa pekerjaan dan membuat objek dan meneruskannya ke lapisan akses data. Ketika saya mencoba untuk mengejek metode lapisan akses data maka itu tidak dapat berhasil mengejek
Di sini saya mencoba membuat kode demo untuk menunjukkan masalah saya.
Model:
public class Employee
{
public string Name { get; set; }
}
Lapisan akses data:
public interface IDal
{
string GetMessage(Employee emp);
}
public class Dal : IDal
{
public string GetMessage(Employee emp)
{
// Doing some data source access work...
return string.Format("Hello {0}", emp.Name);
}
}
Lapisan logika bisnis:
public interface IBll
{
string GetMessage();
}
public class Bll : IBll
{
private readonly IDal _dal;
public Bll(IDal dal)
{
_dal = dal;
}
public string GetMessage()
{
// Object creating inside business logic method.
Employee emp = new Employee();
string msg = _dal.GetMessage(emp);
return msg;
}
}
Tes unit:
[TestMethod]
public void Is_GetMessage_Return_Proper_Result()
{
// Arrange.
Employee emp = new Employee; // New object.
Mock<IDal> mockDal = new Mock<IDal>();
mockDal.Setup(d => d.GetMessage(emp)).Returns("Hello " + emp.Name);
IBll bll = new Bll(mockDal.Object);
// Act.
// This will create another employee object inside the
// business logic method, which is different from the
// object which I have sent at the time of mocking.
string msg = bll.GetMessage();
// Assert.
Assert.AreEqual("Hello arnab", msg);
}
Dalam unit test case pada saat mengejek saya mengirim objek Karyawan tetapi ketika menjalankan metode logika bisnis, itu menciptakan objek Karyawan yang berbeda di dalam metode. Itu sebabnya saya tidak bisa mengejek objek.
Kalau begitu bagaimana cara mendesain sehingga saya bisa menyelesaikan masalah?
sumber
Jawaban:
Alih-alih membuat
Employee
objek secara langsung dengan menggunakannew
, kelas AndaBll
bisa menggunakanEmployeeFactory
kelas untuk ini, dengan metodecreateInstance
, yang disuntikkan melalui konstruktor:Konstruktor harus mengambil objek pabrik melalui antarmuka
IEmployeeFactory
, sehingga Anda dapat mengganti pabrik "asli" dengan mudah oleh pabrik tiruan.Pabrik tiruan dapat memberikan tes dengan segala jenis
Employee
objek yang Anda butuhkan untuk pengujian Anda (misalnya,createInstance
selalu dapat mengembalikan objek yang sama):Sekarang menggunakan tiruan ini dalam pengujian Anda harus melakukan trik.
sumber
Saya akan memperlakukannya sebagai satu unit untuk diuji.
Selama Anda mengontrol semua input dari mana
Employee
objek dibuat, fakta bahwa itu dibuat dalam objek yang diuji tidak masalah. Anda hanya perlu metode tiruan untuk mengembalikan hasil yang diharapkan jika konten argumen sesuai dengan harapan.Jelas itu berarti Anda harus memberikan logika khusus untuk metode tiruan. Logika tingkat lanjut seringkali tidak dapat diuji hanya dengan tipe ejekan "for x return y".
Bahkan, Anda tidak harus membuatnya mengembalikan objek yang berbeda dalam pengujian daripada yang akan diproduksi, karena jika Anda melakukannya, Anda tidak akan menguji kode yang membuatnya. Tetapi kode itu adalah bagian integral dari kode produksi dan oleh karena itu harus dicakup oleh test case juga.
sumber
Employee
objek yang berbeda dalam pengujian, Anda tidak akan menguji kode yang biasanya membuatnya. Jadi Anda tidak harus mengubahnya.Ini adalah kegagalan dari beberapa alat pengujian, Anda harus selalu menggunakan antarmuka dan semuanya harus dibuat dengan cara yang memungkinkan Anda untuk menukar objek berbasis antarmuka dengan yang lain.
Namun, ada alat yang lebih baik - ambil Microsoft Fakes (disebut Mole) yang memungkinkan Anda untuk menukar objek apa pun, bahkan yang statis dan global. Dibutuhkan pendekatan yang lebih rendah untuk mengganti objek sehingga Anda tidak harus menggunakan antarmuka di mana-mana sambil tetap menggunakan cara menulis tes yang biasa Anda lakukan.
sumber