Je travaille sur une application à plusieurs couches. Couche d'accès aux données pour récupérer et enregistrer les données de la source de données, logique métier pour manipuler les données, interface utilisateur pour afficher les données à l'écran.
Je fais également des tests unitaires de la couche logique métier. La seule exigence est de tester le flux de la logique de la couche métier. J'utilise donc le framework Moq pour simuler la couche d'accès aux données et tester unitairement la couche de logique métier avec MS Unit.
J'utilise la programmation d'interface pour faire le plus possible découpler la conception afin que le test unitaire puisse être effectué. La couche métier appelle la couche d'accès aux données via l'interface.
Je rencontre un problème lorsque j'essaie de tester l'une des méthodes de logique métier. Cette méthode fonctionne et crée un objet et le transmet à la couche d'accès aux données. Lorsque j'essaie de se moquer de cette méthode de couche d'accès aux données, elle ne peut pas se moquer avec succès.
Ici, j'essaie de créer un code de démonstration pour montrer mon problème.
Modèle:
public class Employee
{
public string Name { get; set; }
}
Couche d'accès aux données:
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);
}
}
Couche logique métier:
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 de l'unité:
[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);
}
Dans le cas de test unitaire au moment de la moquerie, j'envoie un objet Employee, mais lorsque j'appelle la méthode de logique métier, cela crée un objet Employee différent à l'intérieur de la méthode. C'est pourquoi je ne peux pas me moquer de l'objet.
Dans ce cas, comment concevoir pour que je puisse résoudre le problème?