Ich habe einen Controller. Von wo ich anrufe (DI von BLL) zur Business Logic Schicht (BLL). Von BLL aus rufe ich die Data Access Layer (DAL) über eine weitere Schnittstelle auf.
Der DAL-Layer-Konstruktor wird mit der DBContext-Instanz injiziert (hier wird keine Schnittstelle injiziert).
Mit MOQ können wir also Controller, BLL & Intermediate Layer testen. Aber wie testet man die DLL-Schicht?
public class DAL():IDAL
{
private DBEntities entity;
public DAL(DBEntities DB)
{
entity = DB;
}
public list<string> ABC()
{
var a = SqlMapper.Query<class>(entity.Database.Connection, "",param,commandType: CommandType.StoredProcedure).ToList();
return a;
}
}
Grundsätzlich meine Frage, wie & was soll ich hier verhöhnen? Hier implementieren wir das IDAL, aber wir injizieren es hier nicht.
Die Frage ist mir immer noch nicht 100% klar, aber ich versuche eine Antwort zu geben.
Es ist nicht notwendig, DBEntities
zu verspotten. Wenn Sie sicherstellen möchten, dass Ihre Abfragen das richtige Ergebnis liefern, testen Sie es mit einer bekannten, vorgefüllten Datenbank, die Sie nur für Ihre Tests verwenden.
Wenn Sie Ihre Geschäftslogik testen möchten und Ihre Datenzugriffsebene überspielen möchten, ist das Spotten hilfreich! Erstellen Sie eine Schnittstelle mit Ihren Methoden:
public interface IDAL
{
List<string> ABC();
}
In Ihrem Komponententest können Sie die Schnittstelle mit
var dataAccessMock = new Mock<IDAL>();
dataAccessMock.Setup(x => x.ABC()).Returns(new List<string> {"ABC", "DEF", "GHI" });
// get an IDAL instance which you can inject / use
var mockedInstance = dataAccessMock.Object;
// get the mocked list
var list = mockedInstance.ABC();