ฉันกำลังทำงานกับแอพพลิเคชั่นที่มีหลายเลเยอร์ ชั้นการเข้าถึงข้อมูลเพื่อดึงและบันทึกข้อมูลจากแหล่งข้อมูลตรรกะทางธุรกิจเพื่อจัดการข้อมูลส่วนติดต่อผู้ใช้เพื่อแสดงข้อมูลบนหน้าจอ
ฉันยังทำการทดสอบหน่วยของชั้นตรรกะทางธุรกิจด้วย ข้อกำหนดเพียงอย่างเดียวคือการทดสอบการไหลของตรรกะเลเยอร์ธุรกิจ ดังนั้นฉันจึงใช้ Moq framework เพื่อจำลองชั้นการเข้าถึงข้อมูลและหน่วยทดสอบชั้นตรรกะทางธุรกิจด้วยหน่วย MS
ฉันใช้การเขียนโปรแกรมอินเทอร์เฟซเพื่อทำให้การออกแบบลดลงมากที่สุดเพื่อให้การทดสอบหน่วยสามารถทำได้ ชั้นการเข้าถึงข้อมูลชั้นธุรกิจโทรผ่านส่วนต่อประสาน
ฉันกำลังประสบปัญหาเมื่อฉันพยายามทดสอบหนึ่งในวิธีการตรรกะทางธุรกิจ วิธีการนั้นจะทำงานและสร้างวัตถุและส่งต่อไปยัง data access layer เมื่อฉันพยายามที่จะเยาะเย้ยวิธีการเข้าถึงข้อมูลเลเยอร์แล้วก็ไม่สามารถจำลองได้สำเร็จ
ที่นี่ฉันพยายามสร้างรหัสตัวอย่างเพื่อแสดงปัญหาของฉัน
รุ่น:
public class Employee
{
public string Name { get; set; }
}
ชั้นการเข้าถึงข้อมูล:
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);
}
}
ชั้นตรรกะทางธุรกิจ:
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;
}
}
ทดสอบหน่วย:
[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);
}
ในกรณีทดสอบหน่วยในเวลาที่ทำการเยาะเย้ยฉันกำลังส่งออบเจกต์พนักงาน แต่เมื่อเรียกใช้เมธอดตรรกะทางธุรกิจมันกำลังสร้างออบเจ็กต์พนักงานที่แตกต่างกันภายในเมธอด นั่นคือเหตุผลที่ฉันไม่สามารถจำลองวัตถุ
ในกรณีนั้นจะออกแบบเพื่อให้ฉันสามารถแก้ปัญหาได้อย่างไร