2016-07-05 17 views
0

I httpContext mit Moq framework zu verspotten ich versuche, dass httContext.Current is not null esnure wenn Anfrage von Unit-Test kommt, konnte aber nicht wirklich machen es zu arbeiten.spöttischen HttpContext.Current Api Controller Unit-Test

Nach googeln, kam ich mit folgenden Schritten so für und nicht sicher, welche Schritte als nächstes sind, bevor ich nach Api controller Ruf machen.

Schritt 1

Add Moq package to project 

Schritt 2

using Moq; 

Schritt 3

var context = new Mock<HttpContextBase>(); 
var request = new Mock<HttpRequestBase>(); 
var response = new Mock<HttpResponseBase>(); 

request.Setup(r => r.UrlReferrer).Returns(new Uri("http://tempuri.org/?ReturnUrl=%2f")); 
response.Setup(r => r.Cookies).Returns(new HttpCookieCollection()); 
context.Setup(c => c.Request).Returns(request.Object); 
context.Setup(c => c.Response).Returns(response.Object); 

Kann mir jemand i vor Gesuch Controller machen tun müssen, für die nächsten Schritte helfen.

+0

Sie Ihren Code Refactoring sollte es zu entkoppeln von 'HttpContext', um es testbar zu machen. Sich über Dinge lustig zu machen, über die man keine Kontrolle hat, erzeugt normalerweise mehr Probleme als es löst. Der Schwierigkeitsgrad, der beim Erstellen eines Komponententests auftritt, ist ein direkter Hinweis darauf, wie gut oder schlecht der Code aufgebaut ist. – Nkosi

+0

Mögliches Duplikat von [Testen einer Web-API-Methode, die HttpContext.Current.Request.Files verwendet?] (Http://stackoverflow.com/questions/31189028/testing-a-web-api-method-that-uses-httpcontext- current-request-files) –

Antwort

0

Verwenden Sie zunächst nicht HttpContext.Current, da es das Testen von Einheiten nicht unterstützt. Innerhalb Ihrer Controller befinden sich Request und Response Eigenschaften, die verwendet werden können, um auf Informationen über Anfrage oder Antwort zuzugreifen. Verwenden Sie sie anstelle von HttpContex.Current.

In Ihnen Unit-Tests können Sie Ihre eigenen ControllerContext setzen. Bitte, schauen Sie sich eine andere Stackoverflow Frage, die, wie in Web-Api zu fälschen ControllerContext beschreibt:

Testing a Web API method that uses HttpContext.Current.Request.Files?

+0

Wie HttpContext.Current Einheitentests nicht unterstützt? 2) Wie verwende ich HttpContext, Request und Reponse statt HttpContex.Current? – simbada

+0

Auch ich kann wahrscheinlich nicht neue ControllerContext tun, denn ich habe Web-API-Controller nicht MVC .. – simbada

+0

OK, das ist richtig. In WebApi können Sie keinen Zugriff auf HttpContext haben, aber alles, was Sie über Request oder Response wissen müssen, kann von den Request- und Response-Eigenschaften des Controllers empfangen werden. Und Sie können immer noch Ihren 'ControllerContext' zum Controller setzen, aber in WebApi kann er' HttpContextBase' nicht im Konstruktor haben. –

1

In Ihrem Fall könnte es viel einfacher Integrationstests zu schreiben.

[Test] 
    public async Task get_should_succeed() 
    { 
     //arrange 
     var url = string.Format("{0}{1}", BaseUrl, "controller"); 

     using(var httpServer = CreateHttpServer()) 
     using (var client = CreateHttpInvoker(httpServer)) 
     { 
      using (var request = CreateHttpRequest(HttpMethod.Get, url)) 
      //act 
      using (var response = await client.SendAsync(request, CancellationToken.None)) 
      { 
       //assert 
       Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); 
      } 
     } 
    } 

Eine vereinfachte Version von ControllerTestBase:

public abstract class ControllerTestBase 
{ 
    protected ControllerTestBase() 
    { 
     BaseUrl = "http://localhost/api/"; 
    } 

    public string BaseUrl { get; set; } 

    public static HttpServer CreateHttpServer() 
    { 
     var httpConfiguration = WebApiConfig.Register(); 
     return new HttpServer(httpConfiguration); 
    } 

    public static HttpMessageInvoker CreateHttpInvoker(HttpServer httpServer) 
    { 
     return new HttpMessageInvoker(httpServer); 
    } 

    public HttpRequestMessage CreateHttpRequest(HttpMethod httpMethod, string url) 
    { 
     return new HttpRequestMessage(httpMethod, url); 
    } 
} 
+0

Ich habe nicht eine einzige Zeile verstanden, was Sie versuchen zu sagen – simbada

+0

Sorry, wenn es klar genug ist. Im Grunde können Sie mit diesem Code einen kleinen Webservice im Speicher hochfahren, um Ihre Eingaben zu definieren und die Ausgabe zu bestätigen. Shameless empfehlen, dass Sie dieses überprüfen: http://stephenzeng.com/Home/View/17 –

+0

Sie meinen also zu sagen, dass das Schreiben von Integrationstest (wie in dem Link, den Sie freigegeben haben, erläutert) die Notwendigkeit vermeiden, httpContext vorzutäuschen? richtig? – simbada

Verwandte Themen