2016-05-01 5 views
0

Ich habe Web Api controller Action method Ich versuche Unit-Test. Ich habe einen benutzerdefinierten Filter, der vor diesem Action-Controller ausgeführt wird.HttpContext.Current immer Null beim Senden der Anfrage von Unit-Test

Ich habe Fragen bezüglich HttpContext.Current.User.Identity.Name, die ich in meinem benutzerdefinierten Aktionsfilter verwende.

Es funktioniert gut, wenn ich meine HTTP-Post-Anfrage von Web-Client senden.

Aber, wenn ich http Post-Anforderung von meinem Unit-Test als HttpContext.Current immer senden beschwert für null

nicht verstehen, wo und was falsch ist. Jeder kann es bitte erklären?

Bitte beachten Sie, dass ich Antworten auf here gesehen habe, aber nicht sicher, wo ich diesen Code in meinem Fall hinzufügen muss.

Antwort

1

Komponententests sind nicht gleichbedeutend mit dem Aufruf Ihrer API über einen Web-Client.

Wenn Sie einen Webclient verwenden, wird Ihre API im Kontext Ihres Webservers (z. B. IIS) ausgeführt, und der Webserver stellt das System mit "current" HttpContext zur Verfügung.

Wenn Sie Code einfach und einfach von einer Komponententestmethode aufrufen, laufen Sie nicht im Kontext eines Webservers, aber Sie nennen es einfach als eine Methode einer Klasse. Natürlich können Sie es tun, aber Sie müssen "Mock" (von gefälschten, wenn Sie wollen) die aktuelle HttpContext zu simulieren, Sie laufen in einem echten Webserver.

Überprüfen Sie diese SO Antwort für die Details, wie es geht.

BTW, dies ist nicht der Fall, wenn Sie Integrationstests ausführen (bedeutet Aufruf der realen API über einen Web-Client und nur die Eingabe-Ausgabe-Ergebnisse überprüfen): In diesem Fall führen Sie Ihren realen Code in einem echten Kontext und Alles wird gut funktionieren.

0

HttpContext.Current ist nicht in einem selbst gehosteten Szenario wie in Ihrem Test festgelegt.

Sie können jedoch einen Wrapper um HttpContext.Current erstellen und ausfüllen, bevor Sie den Test ausführen. Wie folgt aus:

public static class CurrentHttpContext 
{ 
    public static Func<HttpContextBase> Instance =() => new HttpContextWrapper(HttpContext.Current); 
} 

Und dann irgendwo in Ihrem Test, wo Sie Ihre HttpSelfHostServer einrichten, füllen Sie die CurrentHttpContext.Instance. Zum Beispiel mit FakeItEasy (https://github.com/FakeItEasy/FakeItEasy):

var context = A.Fake<HttpContextBase>(); 
CurrentHttpContext.Instance =() => context; 

Dann können Sie CurrentHttpContext.Instance Zugriff statt HttpContext.Current in Ihren Filter:

public class MyAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var context = CurrentHttpContext.Instance(); 
     // stuff 
    } 
} 
Verwandte Themen