Integration Testing mit Entity Framework code first mit in-memory-Datenbank
Ich würde gerne die tatsächlichen integration tests meiner EF4.1 repositories gegen eine in-memory-Datenbank a la ayende die nhibernate-version.
Habe ich einen code-first-Modell, gegen eine legacy-Datenbank (alte Tabellen-und Spaltennamen müssen mapping auf meine entites verwenden von code-Konfigurationen).
Ich würde gerne in der Lage sein zu verwenden, Sqlite (oder andere):
- Generieren eines in-memory-Datenbank von meinem Modell
- Erstellen Sie eine DBContext für mein Modell mit dieser in-memory-Datenbank
- Ich habe bereits IoC/DI von einem IDBContextFactory die wird konstruiert, mit meinem (Generic) - Archive (auch mit einem GenericRepository Muster)
Gibt es bits und bobs auf-Linie, die nahelegen, dass es möglich sein sollte, aber nicht viel für den code-first-Ansätze. Wer weiß, ob dieses möglich ist?
Einige Ausschnitte meiner test-Bibliothek finden Sie unter //THROWS ERROR
Kennzeichnung runtime-Fehler:
public class MyDbContextFactory : IDbContextFactory
{
private static object context;
public object CurrentContext
{
get {
if(context == null)
{
// ?? DOESN'T WORK AS THERE'S NO META DATA
var connBuilder = new EntityConnectionStringBuilder();
connBuilder.Provider = "System.Data.SQLite";
connBuilder.Metadata =
@"res://*/TestEfDb.csdl|res://*/TestEfDb.ssdl|res://*/TestEfDb.msl";
connBuilder.ProviderConnectionString =
ConfigurationManager.ConnectionStrings["DataContext"].Name;
var entConnection = new EntityConnection(connBuilder.ConnectionString);
// THROWS ERROR: sqlite Format of the initialization string does not
// conform to specification starting at index 0
// for connection string "Data Source=:memory:;Version=3;New=True;"
//var entConnection = new EntityConnection
// (ConfigurationManager.ConnectionStrings["DataContext"].Name);
context = new MyDbContext(entConnection);
}
return context;
}
}
}
...
[Test]
public void test_me()
{
var auditRespository = new AuditRepository(new MyDbContextFactory());
auditRespository.GetAll<Audit>();
}
- Mehrmals erwähnt Sie die erste code, aber in der gleichen Zeit, die Sie bauen entity connection-string verweisen auf die Ressource-Dateien aus der EDMX-Datei (designer -) also, welche Art von Ansatz verwenden Sie?
- Zitat: "?? FUNKTIONIERT NICHT, WIE THERES KEINE META-DATEN" seinen ersten code
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie SQL Compact 4.0 (download beide SqlCE und tools von web platform installer) - EF Code first hat direkte Unterstützung für die. Der einzige Unterschied wird sein, dass die Anwendung Verbindungszeichenfolge für große SQL-Server:
und Ihre tests nutzen den connection string zu SQL-Compact:
Werfen Sie einen Blick auf diese Artikel: Faking Ihre LINQ-provider. Es wird beschrieben, wie Sie verstecken können, Entity Framework hinter einer Abstraktion, so dass Sie leicht zu unit-testen Sie Ihre Anwendung, während immer noch erlaubt die Verwendung von LINQ (über
IQueryable
) - Abfragen im code der Anwendung.Beachten Sie, dass dies nicht vollständig zu entfernen die Notwendigkeit der Schriftform integration tests, da würden Sie immer noch benötigen zum testen des Datenbank-mapping-Schicht und eventuell testen, ob der gewählte LINQ-provider ist in der Lage zum ausführen von LINQ-Abfragen.