Sto lavorando a 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.
Faccio anche test unitari del livello di 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 testare il livello di logica aziendale con MS Unit.
Sto usando la programmazione dell'interfaccia per rendere il più possibile disaccoppiante la progettazione in modo da poter eseguire il test unitario. Livello di accesso ai dati delle chiamate del livello aziendale tramite l'interfaccia.
Sto riscontrando un problema quando provo a testare uno dei metodi della logica aziendale. Tale metodo funziona e crea un oggetto e lo passa al livello di accesso ai dati. Quando sto cercando di deridere quel metodo del livello di accesso ai dati, allora non riesco a deridere 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 di 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 unit test al momento del derisione, sto inviando un oggetto Employee ma quando invoco il metodo della logica aziendale, sta creando un diverso oggetto Employee all'interno del metodo. Ecco perché non riesco a deridere l'oggetto.
In tal caso, come progettare in modo da poter risolvere il problema?