2017-08-27 3 views
1

Ich habe OWIN Web API App, die ich versuche, Integrationstest. Um dies zu tun, einen Server im Gedächtnis wie so ich schaffe:OWIN Integrationstest - HttpContext ist null

private TestServer _server; 

    [TestInitialize] 
    public void Intitialize() 
    { 
     _server = TestServer.Create<Startup>(); 
    } 

Integrationstest:

[TestMethod] 
    public async Task Test_Controller() 
    { 
     //Act 
     var response = await _server.HttpClient.GetAsync("/controller/test"); 

     //Assert 
     Assert.AreEqual(HttpStatusCode.Ok, response.StatusCode); 
    } 

In meinem Controller ich einige Informationen aus dem Httpcontext zugreifen bin versucht, das ist leider ist immer Null während des Integrationstests und löst daher eine Ausnahme aus.

Kann ich den httpcontext bei meinen Integrationstests trotzdem überspielen?

+1

Ein Integrationstest, der den HTTP-Kontext verhöhnt, ist kein Integrationstest. Was versuchst du hier wirklich zu testen? –

+0

U kann die API-Methoden eins nach dem anderen ohne den Server-Teil testen –

+0

@tomredfern Da ich In-Memory-Tests mache, ist der HTTP-Kontext immer Null afaik. Das ist der Grund, warum ich irgendwie einen gefälschten httpcontext hineinbringen muss. – Kaladin

Antwort

1

Sie verfügen über eine Web-App-CodeBase mit Eigenkompatibilität, die in IIS gehostet wird. Sie fügen nun Integration-Test hinzu und verwenden eine In-Memory-Instanz Ihrer Web-App.

Wie bereits erwähnt, stimmen Ihre Integrationstests nicht genau mit Ihrer IIS-gehosteten WebApp überein. IIS kann einige HTTP-Module ausführen, die nicht von Ihrem Owin-Host ausgeführt werden. HttpContext on None-IIS-Hosting fehlt auch.

Wenn Sie die NullReference-Exception, die Sie bei der Verwendung von HttpContext trifft, einfach loswerden wollen, sollten Sie Ihre Codebasis aktualisieren und einen Ersatz für HttpContext finden. (zB: für principal, use requestContext)

Für das Szenario benötigen Sie Ihr eigenes Context-Objekt und müssen ein Stub/Mock in Ihren Owin-Host injizieren: Inject Verhalten beim Start Ihres In-Memory-Hosts:

_server = Microsoft.Owin.Hosting.WebApp.Start("url", (appbuilder) => 
      { 
       // your default startup (of TestServer.Create) 
       // register some custom stubs/mocks using ioc setup or owin middleware 
      });