Frage

Ich habe schon immer vorgetäuscht / verspotten / stubbing Httpcontext irgendwie in ASP.NET (viel einfacher, in ASP.NET MVC / Monorail).

Aber ich kann sehen, dass sich leicht Httpcontext konstruiert werden kann, buchstäblich mit paar Zeilen Code.

var tw = new StringWriter();
var workerReq = new SimpleWorkerRequest("/webapp", @"c:\here\there\wwwroot", "page.aspx", tw);
var context = new HtpContext(workerReq);

Wenn wir diesen Code in etwa so aus wickeln werden sollte es funktionieren, und wahrscheinlich können wir auch machen ASPX mit, dass:

using(Simulate.HttpContext()) {
  HttpContext.Current.BlaBla;
}

So sind die Fragen sind:

  1. Gründe, warum es nicht getan werden sollte.
  2. Gründe, warum es getan werden sollte.
  3. Warum es nicht weit verbreitet ist (in der Tat Ich erinnere mich noch keine Beiträge über sie).

Ich erinnere mich an einen Pfosten, wo Phill Haack Httpcontext Reflection Hacks mit aufgebaut.
Aber es scheint, es ist einfach nicht nötig.

Cheers,
Dmitriy.

War es hilfreich?

Lösung

Es ist gut für sehr einfache Tests zu tun, aber wie würden Sie Einheit eine Komponente testen, die HttpRequest.Files verwendet? Soweit ich weiß, es gibt keine öffentlichen APIs Sie dies angeben, auf SimpleWorkerRequest zuzulassen sind. Auch wenn Sie einen Ort gefunden, wo Sie eine HttpFileCollection Eigenschaft könnte, beachten Sie, dass Konstruktor intern ist, so kann man nicht einmal eine Instanz dieses Typs erstellen.

HttpRequest.Files ist nicht allein in dieser Hinsicht und in der Tat gibt es wahrscheinlich wesentlich mehr Dinge, die Sie kann nicht Test mit der aktuellen Httpcontext Implementierung als Sie kann Test . Dies ist, wo Abstraktionen wirklich nützlich sein.

Andere Tipps

Es gibt ein paar Szenarien zu berücksichtigen.

Szenario eins: Sie sind Unit-Tests. Sie haben etwas klein, wie eine Klasse, die den Zugriff auf den Cache verwaltet und welche Anrufe HttpContent.Cache ausdrücklich. In diesem Fall verspotten den Kontext, so können Sie sehen, was Anrufe gemacht werden, und ob sie arbeiten die wy Sie erwarten.

Szenario zwei: Sie einen Integrationstest zu tun, wo Sie versuchen, etwas groß wie die Erzeugung einer komplexen Seite zu testen. In diesem Fall gibt die reale HttpContent Objekt so, wie Sie gefunden haben. Ihr Integrationstest wird besser auf die reale Laufzeit simulieren.

Das könnte funktionieren, aber ...

  • Zum einen habe ich einige Wege zu sehen, dass in Umgebungen anders sein könnte.
  • Zweitens braucht es installiert so etwas wie IIS?
  • Wie viel Zeit es zu schaffen nimmt? Wenn ich 100 Tests habe, die sie benötigen, und es dauert 1 Sekunde, dann das bedeutet, meinen Testlauf über Minuten oder mehr länger und es führt zu Entwicklern laufenden Tests weniger.
  • Wie können Sie leicht verspotten / Setup Cache, Anfrage usw. für die Erstellung von Testszenario?

Mocking / Anstoßen ist wahrscheinlich einfacher.

Bearbeiten

einige Quellcode gefunden für Httpcontext und SimpleWorkerRequest in Mono-Projekt:

Die können einen besseren Einblick geben, was in der Schöpfung geschieht.

einen Artikel gefunden, was hilfreich sein könnte genauso gut: ASP .NET CreateApplicationHost / SimpleWorkerRequest API Loch

Das zeigt eigentlich sehr schön, dass wir müssen verstehen, was in diesem Objekt geschieht, bevor sie sie anwenden und es braucht Zeit. Mocking scheint einfacher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top