2009-04-06 6 views
25

... absolut nichts?System.Web.Abstractions: wofür ist es gut?

Welchen Teil des Puzzles füllen ist es für ASP.NET WebForms und ASP.NET MVC jeweils?

Können Sie irgendwie eine ASP.NET * -Basisanwendung erstellen, die System.Web.Abstractions verwendet, damit sie in beiden Arten von ASP.NET-Webanwendungen verwendet werden kann?

In diesem Fall, wie passten sie die Klassen in System.Web.Abstractions zurück in ASP.NET WebForms?

Sie können keine Objekte aus dem Namespace neu erstellen, so dass sie nicht zum Spotten verwendet werden können, oder?

Update: Tut mir leid, dass ich nicht weiß, dass ich das Problem mit dem Testen von HttpContext und anderen build-it ASP.NET-Objekten kenne. Aber danke für gute Erklärungen.

+6

Ganz aus dem linken Feld, aber dank deines Fragetitels habe ich jetzt Krieg von Edwin Starr in meinem Kopf. :( –

Antwort

35

Der Namespace enthält Typen, die ausgelegt sind, ASP zu wickeln. NET-Kernklassen (wie HttpSessionState).

Was, willst du wissen warum?

Viele dieser Kern-ASP.NET-Klassen sind versiegelt oder statisch, sodass Abhängigkeiten zwischen ihnen und Ihrem Code nicht aufgehoben werden können. Das bedeutet, dass Sie diese Kernabhängigkeiten nicht vortäuschen können, wodurch es viel schwieriger wird, Ihren ASP.NET-Code zu testen. Anstatt also direkt die HttpResponse direkt im Code zu manipulieren, manipulierst du sie über die HttpResponseWrapper, die du während der Testzeit stubsen oder ausspotten kannst, um zu steuern, wie sich das HttpResponse-Objekt verhält.

Wenn Sie jemals darüber nachgedacht haben, diese Wrapper zu erstellen, oder eine oder zwei davon schon einmal implementiert haben, wissen Sie, dass in diesem Namespace viel Arbeit steckt und ich bin froh, dass sie das getan haben es.

17

Es ist in der Tat zum Mocking. - HttpContext ist eine versiegelte Klasse und kann nicht (einfach) verspottet werden. HttpContextBase ist nicht versiegelt und ich glaube, dass es Methoden sind, die virtuell sind, was Spott viel einfacher macht.

Sie können zwar nicht neu-up eine Instanz von Httpcontextbase (beispielsweise für den Einsatz in WebForms), können Sie eine Instanz über erhalten:

var ctx = new HttpContextWrapper(HttpContext.Current);