2009-03-26 16 views
2

Ich war in diesen Fehler läuftVerwenden von Datenbank-in Komponententests

An attempt to attach an auto-named database for file C:\<...>\Out\MessagesDB.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.. 

Versuch zum Testen eines Controler einige Unit-Tests zu schreiben. Ich glaubte das Problem war, dass die Tests versuchten, die Datenbank, die ich im Hauptprojekt definiert hatte, nicht zu verwenden. So modifizierte ich die Verbindungszeichenfolge in den Tests zu

Im App.config für das Testprojekt I

bin mit
<connectionStrings> 
    <add name="MessagesDBConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MessagesDB.mdf;Integrated Security=True;User Instance=True" 
     providerName="System.Data.SqlClient" /> 
</connectionStrings> 

und overrode dann das Datenverzeichnis von

AppDomain domain = AppDomain tun. AktuelleDomäne;

 String currentDirectory = System.Environment.CurrentDirectory; 
     String DataDirectory = currentDirectory.Substring(0, currentDirectory.IndexOf("TestResults")) + "Server\\App_Data"; 
     domain.SetData("DataDirectory", DataDirectory); 
     db = new Server.Models.MessagesDBDataContext(); 

die großen Werke, sondern sieht aus wie ein Hack. Wie soll ich das gemacht haben?

Edit:

ich heute an diesem schrecklichen Chaos noch einen Blick nahm und auf Basis der I des Nerds Abendessen Beispiel alle direkten Anrufe auf die Datenbank von den Controllern in meinem Projekt entfernt und bewegt sie in ein Repository-Objekt welche implementiert eine Schnittstelle (IRepository). Dann habe ich ein falsches Repository-Objekt erstellt, das auch IRepository implementiert hat. Ich fügte jedem Controller einen Konstruktor hinzu, der die Verwendung eines IRepository erlaubte. Der Standardcontrollerkonstruktor wurde dann geändert, um ein Repository zu initialisieren. Die Tests sprechen nicht mehr mit der Datenbank, daher sind sie schneller und weniger zerstörerisch.

Antwort

6

Der Standardansatz besteht darin, die Datenbank nachzuahmen. Das bedeutet, dass die Klasse, die Sie testen, einen Parameter verwendet, der Daten bereitstellt und wie eine Datenbankverbindung aussieht.

In den Komponententests übergeben Sie tatsächlich eine Implementierung, die hart codierte Daten bereitstellt.

Es gibt Tools, die Ihnen dabei helfen können, zB indem Sie die Ergebnisse einer Datenbankabfrage in einer Konfigurationsdatei speichern, so dass Sie den Test mit echten Daten einrichten können, aber es wird schnell geladen und ändert sich nie weil Es ist jetzt in einer Datei getrennt von der Datenbank gespeichert. SnapDAL ist ein Tool, das Sie dafür verwenden können.

+0

Können Sie näher auf die Arten von Werkzeugen eingehen, die das tun können? Ich will! –

+0

Rhino Mocks und Moq werden das Spott für dich tun. Aber wie vertraut sind Sie mit Schnittstellen? –