Я працюю над додатком, який має кілька шарів. Шар доступу до даних для отримання та збереження даних з джерела даних, бізнес-логіка для маніпулювання даними, інтерфейс користувача для відображення даних на екрані.
Я також роблю одиничне тестування рівня бізнес-логіки. Єдина вимога - перевірити потік логіки бізнес-шару. Тому я використовую Moq Framework для знущання над рівнем доступу до даних і тестуванням рівня бізнес-логіки за допомогою 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 всередині методу. Ось чому я не можу знущатися над об’єктом.
У такому випадку як спроектувати так, щоб я міг вирішити проблему?