2011-01-07 19 views
3
public List<int> GetPortfolioList() 
{ 
    using (var connection = new SqlConnection("<connectionString>")) 
    using (var command = new SqlCommand("SELECT * FROM Portfolio", connection)) 
    { 
     connection.Open(); 
     var portfolioTable = SqlHelper.GetDataTable(command); 
     var portfolios = from DataRow row 
          in portfolioTable.Rows 
          select int.Parse(row["Portfolio"].ToString()); 

     return portfolios.ToList(); 
    } 
} 

Verwenden Sie diese Methode in einem SQL DAL-Provider, um eine Liste von Portfolios abzurufen, wie der Name (und der Code) vermuten lassen. Da die Datenbanktabelle für Integrationstests eine recht statische Datenmenge enthält, können wir gegen mehrere Erwartungen sprechen. z.B. Die Liste der Portfolios werden: - nicht leer sein - enthält bestimmte bekannte Werte - enthalten keine DuplikateWürde ein Komponententest diesem Beispiel eines DAL-Anbieters über einen Integrationstest hinaus einen Wert hinzufügen?

ein Peer-Review-Folgen, bestand darauf, jemand, dass dieser Code nicht richtig (isoliert) getestet, weil es stützt sich auf Datenbankzugriff. Wenn der größte Teil des Werts darin besteht, sicherzustellen, dass diese Methode Daten aus einer Datenbank zurückgibt, deren Status garantiert ist, konnte ich den Wert beim Mocking des Datenbankaufrufs nicht sehen, um einen Komponententest für diese Methode zu schreiben . Fehle ich etwas?

Antwort

1

Ich würde Ihnen zustimmen, der einzige Wert hier wird Integrationstests sein, es gibt wirklich nichts zu Unit-Test ohne pedantisch zu sein.

Der Komponententestcode für irgendwelche Anrufer dieser Methode sollte diese Methode selbstverständlich verspotten.

e: Die Ausnahmefälle, die MathewMartin oben erwähnt hat, wären die einzigen Dinge, die ich in diesem Szenario als Einheitstests betrachten würde.

3

Die Methode verwendet Linq, um einige Werte aus der DB in eine Liste von ganzen Zahlen zu projizieren - Sie können testen, ob es das richtig macht.

Ich würde den Code in zwei teilen - die Datenabfrage und die Projektion (Linq Abfrage) - Sie könnten dann die linq Abfrage mit Pseudo Daten testen, ohne die Datenbank zu verspotten.

Ich würde auch sagen, es gibt wenig Wert in Einheit testen Datenzugriffscode.

+0

Keines dieser Dinge würde jedoch sein Code testen. In einem testen Sie die Linq-Implementierung, in der anderen testen Sie den db-Code. – heisenberg

+0

@kekekela - nein, du würdest testen, dass sein _use_ von linq wie erwartet ist, d. H. Dass er es richtig macht. – Oded

2

Als Test Purist glaube ich, dass ich eine DAL nicht "Unit-Test" kann, weil ich es nicht isoliert machen kann. Das bedeutet, dass ein Teil meines Codes, der mit der Datenbank interagiert, ohne Komponententests auskommt. Der obige Code sieht gut aus; Stellen Sie nur sicher, dass es als Teil eines größeren Vertrags existiert, den Sie in anderen Objekten testen können.

Ich mache jedoch Integrationstests, indem ich eine Datenbank erstelle, sie säe und sicherstelle, dass mein DAL funktioniert.

4

Ich nehme die gegenteilige Ansicht, weil ich gerade eine gefälschte db (mit Hilfe von Speicher-Listen) zu schreiben, um linq zu sql (oder linq zu allem) Einheit testbar zu machen.

Dies ist eine Frage, die ich verwendet habe, um einen geeigneten Weg zu finden, um die Datenbank zu fälschen. (vom Lesen Ihres Codes, aber das eingebettete "SELECT * FROM" bedeutet, dass Sie auf SQL mehr als linq lehnen, was es schwieriger macht, Ihren Code in Sachen zu faktorisieren, die von SQL Server und Sachen, die linq ist, ausgeführt werden die Lage zu tun hat.

How are people unit testing code that uses Linq to SQL

ich jetzt Unit-Tests ausführen kann, die selbst wenn die Datenbank von der Wand abgezogen ist.

über die Eignung von meiner Linq-Abfrage je gelingen wird oder nicht für Beispiel: Wie reagiert Ihr Code, wenn row ["Portfolio"]. ToString() null ist, wie geht das? reagiert der Code, wenn dieser keine Zeilen zurückgibt oder 2 zurückgibt?

Und auch wenn Sie nur Integrationstests durchführen, ist Nunit kein schlechter Weg zu Integrationstests, seien Sie vorsichtig, sie nicht Komponententests zu nennen, damit sich ein Purist nicht darüber aufregt.

+0

+1 guter punkt ... – heisenberg

Verwandte Themen