Wie unit test eine Methode mit einer `mit` - Anweisung?
Wie kann ich schreiben Sie einen unit test für eine Methode, die eine using-Anweisung?
Lass Sie uns zum Beispiel annehmen, dass ich eine Methode Foo
.
public bool Foo()
{
using (IMyDisposableClass client = new MyDisposableClass())
{
return client.SomeOtherMethod();
}
}
Wie kann ich testen, sowas wie den obigen code?
Manchmal habe ich Sie nicht zu verwenden using
Anweisung und Dispose()
ein Objekt manuell. Ich hoffe, dass jemand mir zeigen, ein trick, den ich verwenden kann.
- Was ist TDD? Die einzige Erweiterung die ich kenne ist Test-Driven Development.
- Es ist Test Driven Development.
- Also Ihre Frage ist "Wie kann ich test-driven development so etwas wie der code oben?"
- Test-driven entwickeln. Schneiden Sie etwas Spielraum mit der Konjugation 🙂
- welche Sprache ist das ?
- Gut, ich war auch versucht, zu zeigen, dass man nicht "test-driven entwickeln" code, der bereits vorhanden ist. Aber, dass gesagt wurde, in mehreren Antworten schon jetzt.
- Der Titel ist "How to TDD-Methode mit
using
Erklärung?" aber dann sagen Sie "Manchmal, wenn ich Sie nicht zu verwendenusing
Anweisung undDispose
ein Objekt manuell." , Die nur dazu dient zu verwirren. Auch, das sieht nicht aus wie TDD zu mir; Sie haben keine Prüfung, sondern Sie haben eine Methode, die Sie testen möchten. In der TDD tests kommen zuerst; es gibt keine Methoden ohne tests. So scheint es, ist dies mehr darüber, wie unit-Tests, dieDispose
genannt wird. Also etwa wie "How to unit-test, dassDispose
genannt wird?" Dann ist die eindeutige Antwort ist pass in die AbhängigkeitIMyDisposableClass
und zu spotten.new
böse ist in Prüfung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie konstruieren die
IMyDisposableClass
mit einem Werk (Injektion in die übergeordnete Klasse) anstatt mit dem new-Schlüsselwort können Sie die verspotten, dieIMyDisposable
und mache ein verify auf die dispose-Methode aufgerufen.Wenn Sie bereits Ihre Codes und Fragen, wie es zu testen, dann bist du nicht schreiben Ihres ersten tests...also nicht wirklich zu tun TDD.
Jedoch, was Sie hier haben, ist eine Abhängigkeit. So der TDD-Ansatz wäre die Verwendung Dependency Injection. Dies kann gemacht werden einfacher, mit einem IoC container wie Einheit.
Wenn dabei TDD "richtig", Ihre Denkprozesse laufen sollte wie folgt in diese Art von Szenario:
Foo
IMyDisposableClass
IMyDisposableClass
in der Klasse, in derFoo
deklariert ist über seinen KonstruktorDann schreiben Sie eine (oder mehrere) tests, die fehlschlagen, und nur dann wären Sie an der Stelle, wo Sie schreiben
Foo
Funktion Körper, und bestimmen, ob Sie benötigtusing
block.In der Realität könnten Sie auch wissen, dass ja, Sie verwenden eine
using
block. Aber der Sinn von TDD ist, dass Sie brauchen nicht zu befürchten, dass, bis Sie bewiesen haben (durch tests), dass Sie tun müssen, verwenden Sie ein Objekt, die dieser verlangt.Sobald Sie festgestellt haben, dass Sie brauchen, um eine
using
blockieren würden Sie dann wollen, einen test schreiben, der fehlschlägt - zum Beispiel mit so etwas wie Rhino Mocks auf die Erwartung, dassDispose
wird aufgerufen, auf ein mock-Objekt implementiertIMyDisposableClass
.Beispiel (mit Rhino Mocks zu verspotten
IMyDisposableClass
).Klasse, in der Sie Ihre Foo-Funktion vorhanden ist, mit
IMyDisposableClass
eingespritzt Abhängigkeit:Und die Schnittstelle
IMyDisposableClass
Foo()
zweimal für die gleiche Instanz vonStuff
?Ihre Frage macht keinen Sinn. Wenn Sie mit TDD, dann sollten Sie bereits über ein test für das, was Sie geschrieben haben. Anforderungen, dann Prüfungen, dann design, dann die Entwicklung. Entweder dein code geht Ihre tests, oder es funktioniert nicht.
Nun, wenn deine Frage ist, wie unit-Tests die obigen Stück code, das ist dann eine andere Frage völlig, und ich denke, die anderen Poster haben geantwortet, dort oben.
Manchmal denke ich, es sind mehr Schlagworte als Entwickler 🙂
Wrapper-Methoden wie die, die nicht unit-getestet werden, denn Sie können nicht geben Sie die relevanten Vorbedingungen oder nachbedingungen.
Wird die Methode getestet, haben Sie, um eine
IMyDisposableClass
- Instanz in der Methode oder in der Klasse-hostingFoo
(und die host-Klasse selbst implementierenIDisposable
), so können Sie eine test-Doppel statt die Reale Sache, um zu überprüfen, mögliche Interaktionen mit ihm.Ihre Frage macht keinen Sinn. Wenn Sie das tun, TDD, dann die Methode die du gepostet hast ist bereits vollständig getestet, sonst könnte es nicht existieren sogar in den ersten Platz. Also, deine Frage macht keinen Sinn.
Wenn auf der anderen Seite, die Methode die du gepostet hast bereits existiert, aber noch nicht vollständig getestet, dann wird Sie nicht tun, TDD und trotzdem, Ihre Frage zu TDD macht keinen Sinn, entweder.
In TDD, es ist einfach unmöglich für ungetesteten code zu existieren. Zeitraum.
Wenn Sie den Test Foo, dann sollten Sie einen Blick auf die Ausgabe von Foo, nicht sich Gedanken über die Entsorgung der Klasse ist es mit intern.
Wenn Sie testen möchten
MyDisposableClass
' dispose-Methode, um zu sehen, ob es funktioniert, sollte eine separate Einheit test gebaut gegenMyDisposableClass
.Brauchen Sie nicht, um unit-test der
using { }
block, denn das ist Teil der Sprache. Sie entweder darauf Vertrauen, dass es funktioniert, oder nicht C# verwenden. 🙂 Ich sehe nicht die Notwendigkeit, zu schreiben unit Tests, um zu überprüfen, dassDispose()
aufgerufen wird.Ohne eine Spezifikation für "Foo", wie können wir sagen, wie es zu testen?
Ich glaube, Sie haben eine zweite, implizite Frage dort - was ist wie zu testen, die Verwendung Ihrer MyDisposableClass korrekt Entsorgt, das Objekt, wenn es freigegeben wird, indem man eine using-Klausel. Dies ist eine separate test-Ausgabe, und sollten nicht kombiniert werden mit dem test, Foo, da die Spezifikation von Foo sollte nicht die Referenz-Implementierung von spezifischen details, wie die Verwendung von Ihrem MyDisposabeClass.
Ich denke, die anderen Poster haben diese Frage beantwortet, also werde ich nicht weiter aufwendig.