我正在研究具有多层的应用程序。数据访问层从数据源检索和保存数据,业务逻辑处理数据,用户界面在屏幕上显示数据。
我还对业务逻辑层进行了单元测试。唯一的要求是测试业务层逻辑流。因此,我使用Moq框架来模拟数据访问层,并使用MS Unit对业务逻辑层进行单元测试。
我正在使用接口编程来使设计尽可能地分离,以便可以进行单元测试。业务层通过接口调用数据访问层。
当我尝试测试一种业务逻辑方法时,我遇到了一个问题。该方法完成了一些工作并创建了一个对象,并将其传递给数据访问层。当我尝试模拟该数据访问层方法时,则无法成功模拟。
在这里,我试图创建一个演示代码来显示我的问题。
模型:
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);
}
在模拟时的单元测试用例中,我正在发送一个Employee对象,但是当调用业务逻辑方法时,它正在该方法内部创建另一个Employee对象。这就是为什么我不能嘲笑对象。
在那种情况下,如何设计才能解决问题?