0

Wir haben eine ASP.NET WebForms-Anwendung, die wir in eine ASP.NET MVC-Anwendung konvertieren werden - einer der Gründe ist, dass wir Unit Testing in vollem Umfang nutzen können und TDD.Unit testet eine ASP.NET MVC 3-Anwendung

Unsere aktuelle WebForms-Anwendung nutzt häufig HttpModules. Wir diskutieren derzeit darüber, ob wir bei HttpModules bleiben oder globale Filter verwenden sollten (jeder Rat wäre hier großartig).

Allerdings, mit meinen wenigen "Hallo Welt" MVC-Anwendungen testen, habe ich nicht herausgefunden, wie der HttpModule (oder in der Tat der Global Filter) Code beim Unit-Test ausgelöst wird.

Vielleicht liege ich falsch, aber es scheint mir, dass ich das Teil meines Komponententests (Integrationstests) brauche, sonst kann es keine wahre Darstellung dessen sein, was in meinem Produktionscode passiert.

Jede Anleitung wäre sehr willkommen.

Dank

Griff

PS - habe ich die folgenden nach den ersten Reaktionen auf meine Frage.

Einfach hergerichtete Use Case

In Produktion

  1. Browser eine Anforderung für eine Controller-Methode
  2. Httpmodule Brände (oder globale Filter) - stellt einen statischen Guid Eigenschaft, um einen Wert zu haben.
  3. Die Controller-Methode nimmt diesen Wert Guid und verwendet sie in ihrer späteren Logik
  4. Richtiges Ergebnis dann an den Browser
  5. zurückgegeben

In Unit Testing

  1. Unit-Test ruft die gleiche Controller-Methode
  2. Das HttpModule (oder der globale Filter) wird nicht ausgelöst - die statische Guid-Eigenschaft hat den Wert Guid.Empty
  3. Die Steuerung Methode, um diesen Guid Wert annimmt, sondern wirft einen Fehler, weil es eine Leere Guid
  4. Unit-Test versagt

Meine Gedanken sind war: auf ein

  • wenn ein Controller-basiert HttpModule (oder Global Filter) zuerst auszuführen, dann ist das HttpModule eine Abhängigkeit und daher müssen die Ergebnisse seiner Aktion Stubbed sein, damit der Test ein echter Einheit Test wird.
  • Wenn der Test den Effekt des HttpModule (oder des globalen Filters) enthalten soll, dann wäre dies ein Integrationstest (obwohl es noch immer nicht klar ist, wie das HttpModule oder der Global Filter als Teil ausgeführt wird) des Integrationstest)
  • die Httpmodule (oder globale Filter) sollten ihre eigene Reihe von Einheit haben Tests

ich denke, dies ist der Ansatz nehme ich, aber wenn jemand könnte vorschlagen, wie ich meine Integration bekommen test (wie oben beschrieben) zu arbeiten dann wäre ich sehr dankbar.

Das Problem, wie ich es sehe, ist, dass mein TEST-Projekt das "Startup" -Projekt beim Ausführen meiner Tests, also die HttpModules (definiert in der Datei web.config des ASP.NET MVC) und die Global Filter (definiert in Die Datei global.asax von ASP.NET MVC wird nicht ausgeführt, da die Dateien web.config und global.asax nicht ausgeführt werden. Die Frage bleibt also: Wie bekomme ich diese in meinem Integrationstest?

Vielen Dank aller

Griff

Antwort

2

Ob ein Httpmodule oder globale Filter ruft durch das Rahmen gehandhabt wird. Sie sollten sich keine Gedanken über Unit Testing Dinge machen, die vom Framework behandelt werden. Ihre Unit Tests sollten nur testen, ob sich Ihr HttpModule oder Global Filter beim Aufruf korrekt verhält.

+0

Hallo Justin - vielen Dank für Ihre Antwort. Ich habe meinem ursprünglichen Beitrag einen Anwendungsfall hinzugefügt, um die Situation näher zu erläutern - ich würde mich über Ihr Feedback freuen. Griff – DrGriff

4

Sie sollten nicht testen, ob der globale Filter ausgelöst wird oder nicht. Der Mechanismus, der den Code auslöst, ist nicht Ihr Code, sondern Teil des Frameworks, also sollte das Framework-Team das testen.

Stattdessen sollten Sie einfach testen, um sicherzustellen, dass der globale Filter angewendet wurde.

+0

Hallo Hattan - danke für deine Antwort, die bestätigt, was Justin gesagt hat. Allerdings habe ich meinen ersten Post mit einem gebrauchsfertigen Use Case erweitert, und ich würde mich über Ihre Gedanken freuen. Griff – DrGriff

1

Ich würde die HTTP-Module und Repositories zum Testen der Controller und Dienste zu verspotten, meiner Meinung nach ist das, wie Sie Einheit testen. Die globalen Filter und httpmodules können Sie mit End-to-End-Tests testen. Ich hoffe es hilft.

+0

Hallo Teahupoo - die Datei web.config des ASP.NET MVC bestimmt, welche HttpModule ausgelöst werden, genau wie die Global.ASAX-Datei von ASP.NET bestimmt, welche globalen Filter ausgelöst werden. Wenn ich meine Tests ausführe, ist das ASP.NET MVC-Projekt jedoch NICHT das Startprojekt, es ist jetzt effektiv eine Bibliotheksassembly, die von meinem TEST-Projekt aufgerufen wird. Daher werden die Dateien web.config und global.asax nicht ausgeführt. Die Frage bleibt also: Wie bekomme ich diese in meinem Integrationstest? – DrGriff

+0

Müssen Sie die Controller testen? Die Idee besteht darin, eine Service-Schicht zu erstellen und nur die Service-Layer zu testen, ohne Controller testen zu müssen. –

+0

Unser Ziel ist es, in unseren Tests eine 100% ige Codeabdeckung zu erreichen und für einige Integrationstests die Controller einzubeziehen (obwohl die Controller zugegebenermaßen sehr wenig Logik enthalten sollten). – DrGriff

Verwandte Themen