여러 레이어가있는 응용 프로그램을 작성 중입니다. 데이터 소스에서 데이터를 검색하고 저장하는 데이터 액세스 계층, 데이터를 조작하는 비즈니스 로직, 화면에 데이터를 표시하는 사용자 인터페이스.
또한 비즈니스 로직 계층의 단위 테스트를 수행합니다. 유일한 요구 사항은 비즈니스 계층 논리의 흐름을 테스트하는 것입니다. 그래서 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 객체가 생성됩니다. 그래서 나는 객체를 조롱 할 수 없습니다.
이 경우 문제를 해결할 수 있도록 디자인하는 방법은 무엇입니까?