2013-07-05 14 views
5

Ich bin relativ neu zu Komponententests und sehr neu zu C#, aber ich habe versucht, Code zu testen, der statische Klassen mit statischen Methoden verwendet, und es scheint wie ich habe um große Mengen an Boilerplate-Code zu schreiben, um zu testen, und dieser Code müsste dann wahrscheinlich auch getestet werden.Testen von statischen Klassen und Methoden in C# .NET

Zum Beispiel: Ich verwende die System.Web.Security.Membership-Klasse, mit einer Methode ValidateUser darauf. Es scheint, als ob ich eine Schnittstelle IMembership mit der Methode ValidateUser erstellen und dann eine Klasse MembershipWrapper erstellen muss, die IMembership implementiert, die Methode ValidateUser implementiert und die Argumente an die tatsächliche Klasse Membership weitergibt. Dann brauche ich Eigenschaften in meiner Klasse, die die Membership verwendet, um den Wrapper zu referenzieren, so dass ich die Abhängigkeit für ein Mock-Objekt während des Testens injizieren kann.

Also, um 1 Codezeile zu testen, die Membership verwendet, musste ich eine Schnittstelle und eine Klasse erstellen und eine Eigenschaft und Konstruktorcode zu meiner Klasse hinzufügen. Das scheint falsch zu sein, also muss ich etwas falsch machen. Wie sollte ich diese Tests durchführen? Ich habe mir kurz einige Frameworks/Bibliotheken angeschaut, die Dependency-Injection durchführen, aber sie scheinen immer noch eine Menge Standard zu benötigen oder ein tiefes Verständnis davon, was unter der Haube passiert.

Antwort

3

Ich sehe nichts falsch daran, Ihr System lose gekoppelt zu machen. Ich glaube, Sie beschweren sich nicht über das Erstellen von Konstruktorparametern und das Übergeben von abstrakten Abhängigkeiten an Ihre Klassen. Aber die Instanziierung von Abhängigkeiten vor Ort sieht so viel einfacher aus, oder?

Auch, wie ich in Kommentaren hingewiesen, können Sie Wrapper später wiederverwenden. Also, das ist keine so nutzlose Arbeit, wie es auf den ersten Blick scheint.

+0

Ich bin all meinen Code lose gekoppelten zur Herstellung und Dependency Injection scheint, wie die Art und Weise, es zu tun.Es scheint nur so, als ob etwas so Grundlegendes und Wichtiges für jede Anwendung so viel Vorabcode erfordert, es wäre gelöst worden, aber ich kann nichts finden, was aussieht, als ob es das Problem tatsächlich löst. – danpalmer

+0

@danpalmer tatsächlich können Sie etwas wie TypeMock verwenden, um statische Methoden zu verspotten, aber das wird Ihren Code nicht lose gekoppelt –

+0

Yeah, TypeMock ist nicht wirklich eine Option, da es Software bezahlt und ich bleibe bei Open-Source-Sachen so viel so wie ich das machen kann. Aber danke für die Empfehlung. – danpalmer

3

Sie sind auf dem richtigen Weg und denken, dass Sie nicht einzelne Codezeile testen, in diesem Fall schreiben Sie wichtige Test, um sicherzustellen, dass Ihr Code mit Mitgliedschaft Provider in der richtigen Weise interagiert, dies ist kein einfacher Komponententest eher "Schein-basierter" Integrationstest. Ich denke es lohnt sich all diese Mocks zu erstellen und diesen Teil der Applikation durch Tests abgedeckt zu haben.

Und ja, es scheint Overkill, aber keine andere Möglichkeit - entweder Sie einige Helfer/Bibliotheken entweder wickeln Sie statische Abhängigkeiten von Drittanbietern selbst.

0

ich Sie nicht zufrieden den Ansatz der Konstruktor Injektion nehmen Sie bei Verwendung Ambient Context

Sie grundsätzlich die Einrichtung eines Standard aussehen könnte, die System.Web.Security.Membership.ValidateUser

Sie rufen dann die freigelegten Methode auf dem Kontext nennen in Ihrem Code und Sie können es jetzt für Ihre Tests verspotten

Dies ermöglicht es Ihnen, weniger Setup-Code zu schreiben, aber es versteckt auch die Tatsache, dass Sie eine Abhängigkeit haben, die ein Problem in der Zukunft sein könnte (je nachdem, wie Sie Code wiederverwenden)

0

Wenn Sie VS2012 verwenden, können Sie in Microsoft Fakes immer Shims für statische Aufrufe (oder auch .Net-Bibliotheksaufrufe) verwenden.

http://msdn.microsoft.com/en-us/library/hh549175(v=vs.110).aspx

http://msdn.microsoft.com/en-us/library/hh549176.aspx

+0

Der Grund, warum ich auf diese Probleme stoße, ist, dass ich von Fakes wegwandere. Ich kann keine Abhängigkeit von einer IDE haben, die so viel kostet. – danpalmer

+0

@danpalmer Ok, Einschränkungen wie diese wurden in Ihrer Frage nicht angedeutet. Das heißt, VS2012 Express ist kostenlos. – Gjeltema

+0

Das Fakes-Framework ist nur in Premium und Ultimate gemäß der Feature-Vergleichsseite verfügbar. – danpalmer

Verwandte Themen