Tôi đang làm việc trên một ứng dụng có nhiều lớp. Lớp truy cập dữ liệu để truy xuất và lưu dữ liệu từ nguồn dữ liệu, logic nghiệp vụ để thao tác dữ liệu, giao diện người dùng để hiển thị dữ liệu trên màn hình.
Tôi cũng làm thử nghiệm đơn vị của lớp logic kinh doanh. Yêu cầu duy nhất là kiểm tra luồng logic của lớp nghiệp vụ. Vì vậy, tôi sử dụng khung Moq để mô phỏng lớp truy cập dữ liệu và đơn vị kiểm tra lớp logic nghiệp vụ với MS Unit.
Tôi đang sử dụng lập trình giao diện để làm cho thiết kế tách rời càng nhiều càng tốt để thử nghiệm đơn vị có thể được thực hiện. Lớp doanh nghiệp gọi lớp truy cập dữ liệu thông qua giao diện.
Tôi đang đối mặt với một vấn đề khi tôi đang cố gắng thử nghiệm một trong những phương pháp logic kinh doanh. Phương thức đó thực hiện một số công việc và tạo một đối tượng và chuyển nó đến lớp truy cập dữ liệu. Khi tôi đang cố gắng giả định phương thức lớp truy cập dữ liệu đó thì nó không thể giả định thành công.
Ở đây tôi đang cố gắng tạo một mã demo để hiển thị vấn đề của mình.
Mô hình:
public class Employee
{
public string Name { get; set; }
}
Lớp truy cập dữ liệu:
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);
}
}
Lớp logic nghiệp vụ:
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;
}
}
Bài kiểm tra đơn vị:
[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);
}
Trong trường hợp thử nghiệm đơn vị tại thời điểm chế nhạo tôi đang gửi một đối tượng Nhân viên nhưng khi gọi phương thức logic nghiệp vụ, nó đang tạo ra đối tượng Nhân viên khác bên trong phương thức. Đó là lý do tại sao tôi không thể chế nhạo đối tượng.
Trong trường hợp đó làm thế nào để thiết kế để tôi có thể giải quyết vấn đề?