Wie mache ich Unit-Tests, um sicherzustellen, dass die gespeicherte Prozedur eine Zeile aus der Datenbank löscht?

8

Ich bin neu im Unit-Test und brauche Hilfe bei folgenden Fragen.

Ich habe ein kleines Projekt erstellt, um zu lernen, wie man Unit-Tests durchführt. Die Funktionalität für eines der Formulare in meiner Anwendung löscht einen Benutzer aus der Benutzertabelle (und anderen Zeilen in Zuordnungstabellen).

Derzeit werden bei dem von mir erstellten Komponententest die erforderlichen Objekte eingerichtet und anschließend die Geschäftsregelmethode (Übergabe der Benutzer-ID) aufgerufen, die die Datenzugriffsmethode aufruft, um die gespeicherte Prozedur auszuführen, mit der die Zeilen in den Tabellen gelöscht werden.

Ist dies die richtige Methode, um zu testen, ob etwas erfolgreich gelöscht wurde? Sollte die Unit-Test- / Setup-Methode zuerst einige Testdaten einfügen, die der Unit-Test dann löscht?

Theomax
quelle

Antworten:

8

IMHO, wenn Sie gerade erst anfangen, Unit-Tests zu lernen, ist es besser, Datenbanken vorerst aus dem Bild zu lassen. Daten in einer Datenbank sind schwieriger zu testen. Wenn Sie Code testen, der eine DB direkt aufruft, handelt es sich nicht mehr um einen Komponententest, sondern um einen Integrationstest .

Sie können Unit-Test-Code zum Bearbeiten einer Datenbank verwenden, dies erfordert jedoch mehr Aufwand und Tools, einschließlich zusätzlicher Frameworks - wie DBUnit in der Java-Welt -, Schnittstellen, Mocks usw., die fortgeschrittenere Themen sind.

Péter Török
quelle
Danke, meine Frage scheint wahrscheinlich sehr neu zu sein. Ich denke, eines der Dinge, die mir schwer fallen, ist die Entscheidung, was getestet werden soll! Daher dachte ich, dass das Testen von Daten in der Datenbank nicht viel anders ist als das Schreiben von Tests, die Werte bestätigen, die von Methoden usw. zurückgegeben werden
Theomax
3
Durch das Schreiben von Komponententests für das kleine Projekt, das ich erstellt habe, wurde mir klar, dass ein Großteil des Codes in die Ebene der Geschäftsregeln verschoben werden muss, anstatt sich im Formularcode dahinter zu befinden! Dies muss ein Beispiel für einen der Vorteile von Untit-Tests sein?
Theomax
@aspdotnetuser: Richtig! Testbarer Code ist wartbarer Code.
Kevin Cline
1
when you are directly testing a DB, it isn't a unit test anymore but integration test.Bist du sicher? Wenn Sie testen, wie eine App mit einer Datenbank
funktioniert,
1
@StuperUser, meine Formulierung war unklar, danke für das Feedback :-) Ich meinte, zB C # -Code zu testen, der direkt von einer DB abhängt (und diese aufruft). Unit-Tests, z. B. gespeicherte Prozeduren in einer Datenbank, sind in der Tat ein anderes Thema. Ich habe meine Antwort oben aktualisiert, um dies zu verdeutlichen.
Péter Török
6

Es wird viel einfacher sein, Komponententests für gespeicherte SQL-Prozeduren in SQL zu schreiben. Schauen Sie sich tSQLt an . Vermeiden Sie es, die gespeicherten Prozeduren in Ihren C # -Einheitentests erneut zu testen. Befolgen Sie den Rat des Ratschenfreaks und verspotten Sie die Datenbank, um den C # -Code zu testen.

Kevin Cline
quelle
2

Sie sollten die (abstrahierte) Datenbank verspotten, während Sie das Formular testen

Im Wesentlichen wird eine Dummy-Implementierung bereitgestellt, die das für die Durchführung der Tests erforderliche Minimum ausführt

Auf diese Weise können Sie beim Aufrufen von submit im Formular sehen, ob deleteUser im Datenzugriff aufgerufen wird

Ratschenfreak
quelle