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?