Sto lavorando su un'applicazione che ha più livelli. Livello di accesso ai dati per recuperare e salvare i dati dall'origine dati, logica aziendale per manipolare i dati, interfaccia utente per mostrare i dati sullo schermo.
Eseguo anche test unitari del livello della logica aziendale. L'unico requisito è testare il flusso della logica del livello aziendale. Quindi uso il framework Moq per deridere il livello di accesso ai dati e l'unità testare il livello della business logic con MS Unit.
Sto usando la programmazione dell'interfaccia per rendere il disaccoppiamento il più possibile possibile, in modo da poter eseguire il test dell'unità. Livello di accesso ai dati delle chiamate del livello aziendale tramite l'interfaccia.
Sto affrontando un problema quando sto provando a testare uno dei metodi di business logic. Quel metodo fa un po 'di lavoro e crea un oggetto e lo passa al livello di accesso ai dati. Quando sto cercando di prendere in giro il metodo del livello di accesso ai dati, allora non può simulare con successo.
Qui sto cercando di creare un codice demo per mostrare il mio problema.
Modello:
public class Employee
{
public string Name { get; set; }
}
Livello di accesso ai dati:
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);
}
}
Livello della logica aziendale:
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 unitario:
[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);
}
Nel caso di test unitario al momento della simulazione sto inviando un oggetto Employee ma quando si richiama il metodo della business logic, si sta creando un oggetto Employee diverso all'interno del metodo. Ecco perché non riesco a deridere l'oggetto.
In tal caso come progettare in modo da poter risolvere il problema?