Pracuję nad aplikacją, która ma wiele warstw. Warstwa dostępu do danych do pobierania i zapisywania danych ze źródła danych, logika biznesowa do manipulacji danymi, interfejs użytkownika do wyświetlania danych na ekranie.
Robię również testy jednostkowe warstwy logiki biznesowej. Jedynym wymaganiem jest przetestowanie przepływu logiki warstwy biznesowej. Więc używam frameworku Moq, aby wyśmiewać warstwę dostępu do danych i testować jednostkę logiki biznesowej za pomocą MS Unit.
Korzystam z programowania interfejsów, aby rozdzielić projekt w jak największym stopniu, aby można było przeprowadzić test jednostkowy. Warstwa biznesowa warstwa dostępu do danych za pośrednictwem interfejsu.
Mam problem z próbą przetestowania jednej z metod logiki biznesowej. Ta metoda działa trochę, tworzy obiekt i przekazuje go do warstwy dostępu do danych. Kiedy próbuję kpić z tej metody warstwy dostępu do danych, nie może ona pomyślnie kpić.
Tutaj próbuję utworzyć kod demonstracyjny, aby pokazać mój problem.
Model:
public class Employee
{
public string Name { get; set; }
}
Warstwa dostępu do danych:
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);
}
}
Warstwa logiki biznesowej:
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;
}
}
Test jednostkowy:
[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);
}
W przypadku testu jednostkowego w momencie drwiącym przesyłam obiekt pracownika, ale podczas wywoływania metody logiki biznesowej tworzy on inny obiekt pracownika wewnątrz metody. Dlatego nie mogę kpić z obiektu.
W takim razie jak zaprojektować, aby rozwiązać problem?