2010-12-15 12 views
6

Wir haben eine wahnsinnig datengesteuerte Anwendung. Wir wollen die Anwendung testen, aber Entwickler sind aufgrund des Datenvolumens nicht in der Lage, komplett gefälschte Repositories zu erstellen. Ich beschuldige sie nicht wirklich.Unit Testing ASP.NET MVC mit Daten

Verstehen, dass wir Tests in eine bestehende Anwendung nachrüsten. Wenn wir anfangen würden, würden wir eine Menge architektonischer Änderungen vornehmen, um bessere Komponententests mit gefälschten Repositories zu ermöglichen.

Wir möchten eine bekannte MDF-Datei mit den Tests verteilen, kopieren und für die Durchführung unserer Tests verwenden. Gibt es dafür eine anerkannte Technik? Ich bin vertraut mit dem Einbetten von Ressourcen in die Test-DLL, aber nicht mit dem Einbetten von MDFs - wenn das überhaupt möglich ist.


Eine Lösung (Art):

ich auf spöttische Linq Daten Kontexten die DataContextWrapper von Andrew Tokeley der Post nehmen endete (http://andrewtokeley.net/archive/2008/07/06/ mocking-linq-to-sql-datacontext.aspx) und erstellt eine FakeDataContext.cs, die im Grunde eine Reihe von Listen ist.

Ich schrieb eine wahrhaft barbarische T4-Vorlage (man denke an „select * from < # = table.BaseClass.QualifiedName #>“) die Daten aus einer bekannten guten Datenbank zu kopieren, um eine große Klasse vollen Sachen zu schaffen wie:

List<Customer> _customers = new List<Customer>(); 
_customers.Add(new Customer(){CustomerId = 1, CustomerName = "ACME"}); 

usw.

Die Klasse ist 25K Linien aber da t4 schreibt alle jene Linien, wer sich interessiert? Es erlaubt uns, nur den Datenkontext zu verspotten, so dass wir unsere linq gegen den falschen Kontext mit einiger angemessener Sicherheit testen können, wir haben die Anfragen richtig. Die ursprünglichen Entwickler setzen eine Menge Geschäftslogik in das Repo, so dass wir die Logik gegen bekannte gute Daten testen können.

+1

Sie suchen nach einer Möglichkeit, Integrationstests durchzuführen, für die @Jakub eine gute Antwort geliefert hat. Welchen Testrahmen verwenden Sie? – mkchandler

+0

Vanille VS 2010, um unsere Einheit (kleine Integration?) Tests zu fahren. So etwas wie: Sperrt die Mitgliedschaftsebene ein Konto nach 5 falschen Passwörtern korrekt ?. Das, und eine Menge Selenium, um das ganze Durcheinander zu überprüfen, arbeitet Suppe zu Nüssen. –

Antwort

5

Können Sie eine Testdatenbank auf einem freigegebenen Server einrichten, sodass Sie keine MDF-Dateien bereitstellen müssen?

Können Sie auch alle Komponententests mit TransactionScope umschließen?

ich eine Testdatenbank in meinem Unternehmen verwendet haben, die eine gut bekannte Referenzdaten für alle Tests enthalten sind, und erstellt so eine Basisklasse für Integrationstests:

[TestClass] 
public class ServiceTest 
{ 
    private TransactionScope Transaction { get; set; } 

    [TestInitialize] 
    public virtual void TestInitialize() 
    { 
     Transaction = new TransactionScope(); 
    } 

    [TestCleanup] 
    public virtual void TestCleanup() 
    { 
     Transaction.Dispose(); 
    } 
} 

Jeder Test es die Änderungen Rollback Es gibt also kein Problem mit Testdaten, die die Datenbank verschmutzen.

+1

Technisch gesehen würden diese "Integrationstests" genannt werden. Dies ist der Ansatz, den ich in meinen Projekten verwende, und es funktioniert großartig! – mkchandler

+0

Es sollte auch beachtet werden, dass xUnit eine integrierte Möglichkeit bietet, dies zu tun: http: //xunit.codeplex.com/ – mkchandler

+0

@mkchandler - du hast Recht - hat die Antwort bearbeitet. Prost! –

0

Haben Sie sich einen spöttischen Rahmen angesehen? Wenn Ihr Code so geschrieben ist, dass Datenabhängigkeiten in die Objekte, die Sie gerade testen, eingefügt werden können, sollten Sie in der Lage sein, diese Datenabhängigkeiten zu überspielen.

Ich hatte großen Erfolg mit Moq, aber dann schrieb ich meinen Code mit Abhängigkeitsinjektion von Anfang an.

+0

Brian erwähnte, dass die App stark datengesteuert ist - ich nehme an, dass das Spotten (eine großartige Übung) nicht sehr machbar ist. Ich arbeitete an der App, die so viele Daten aus der Datenbank verwendete und die Logik war über so viele Klassen/Dienste verteilt, dass es unmöglich wäre, es zu verspotten, ohne es vorher neu zu schreiben ;-) –

+0

Ja, es ist ein Durcheinander. Wir verwenden moq, wo wir können, aber die Mengen gefälschter Daten sind einfach verrückt. Wir injizieren die Datenabhängigkeiten, aber die gefälschten Repositories werden einfach riesig. –