2009-07-06 9 views
10

Update:Best Practices für die Httpcontext und prüfbar Controller in ASP.Net MVC

Basierend auf ein paar der Antworten, die ich erhalten habe, ich möchte nur klarstellen, dass ich bewusst bin, wie etwa gehen spöttisch HttpContext mit einem Mock Framework. Ich bin mehr interessiert zu wissen, was die Vor- und Nachteile des Mocking HttpContext im Vergleich zur Verwendung von Wrapper-Klassen um HttpContext.


ich für Meinungen zu suchen, wie man mit Httpcontext beschäftigen, wenn prüfbar Controller in ASP.Net MVC zu bauen. Nach dem Lesen von es scheint zwei Denkrichtungen zu sein - entweder bauen Sie von HttpContextBase ab und verwenden ein spöttisches Framework, um die benötigten Stubs/Mocks für Ihr Unit-Testing zu generieren oder agnostische Wrapper-Klassen um die Bereiche von HttpContext zu bauen, die Sie verwenden wollen .

Momentan lehne ich den Aufbau von HttpContextBase. Es scheint, als ob es sowohl der schnellere Entwicklungsprozess als auch die Wartung ist, da Sie keine Zeit für die Entwicklung und Wartung zusätzlicher Wrapper-Klassen aufwenden müssen. Ich kann sehen, wie die Wrapper-Klassen nützlich sein könnten, da sie die zugrunde liegende Implementierung abstrahieren und den Kontext des Controllers von der Anfrage getrennt halten - aber ich bin mir nicht sicher, ob dies den zusätzlichen Aufwand für Einrichtung und Wartung wert ist.

Was sind Ihrer Meinung nach die Vor- und Nachteile dieser beiden Ansätze und wann würden Sie sich für eines entscheiden? Gibt es bestimmte Arten von Entwicklungen, die sich für eine der Lösungen mehr eignen als die andere?

Da dies ein häufiges Problem zu sein scheint, müssen sich die meisten Teams, die Einheitentests durchführen und ASP.Net MVC verwenden, damit befassen, wie würdest oder würdest du dieses Problem behandeln? Wenn Sie dieses Problem gelöst haben, wie hat Ihre Lösung funktioniert und was würden Sie jetzt anders machen?

Antwort

6

Ich bin auf HttpContextBase gelehnt. Hauptsächlich weil ich denke, dass es genau aus diesem Grund erfunden wurde: Testbarkeit. Und warum sollte man das Rad neu erfinden, wenn es schon eine akzeptable Lösung gibt?

Wenn Sie viel Mühe in die Wrapper-Klassen um Httpcontext setzen, würden Sie mit etwas sehr ähnliches am Ende zu ... Httpcontextbase

1

Zum Testen verwende ich Rhino.Mocks. Um den HttpContext im Controller einzurichten, habe ich ihn einfach verspottet. Also mein System unter Test (oder sut) ist so etwas wie:

  Controller controllerBase = sut as Controller; 

ich dann den Controller Kontext verspotten, und den Kontext auf dem Controller Kontext eingerichtet, um den Schein der Httpcontextbase-Klasse zurückzukehren (wie ich oben erwähnt). Mein Code sieht ungefähr so ​​aus:

controllerContext = AMockOf<ControllerContext>(); 

// Add the test HttpContextBase to the controller context 
HttpContextBase httpContextBase = SetUpTestHttpContext(); 
WhenThe(controllerContext).IsAskedForIts(x =>x.HttpContext).Return(httpContextBase).Repeat.Any(); 

Für andere Objekte, die ich manchmal Fälschungen als auch nutzen.

+0

Wie Sie Ihre Erfahrungen mit diesem Setup war? Haben Sie festgestellt, dass es wartbar, praktikabel usw. ist? –

+0

Yup, es hat sehr gut für mich gearbeitet. Der Trick besteht darin, alles in einer Basisklasse zu verbergen, von der Ihre Testklassen abstammen, also tun Sie es einmal und müssen sich nicht jedes Mal darum kümmern. – Erik

Verwandte Themen