2016-07-01 4 views
0

Ich habe eine OWIN-Middleware, die nach einem bestimmten Wert in der Abfragezeichenfolge sucht und einen anderen Wert in der Abfragezeichenfolge aktualisiert. Ich verwende Microsoft.OWin.Testing, um dieses Stück Middleware aufzurufen und dann eine Anfrage zu stellen. Wie überprüfe ich genau, dass die Abfragezeichenfolge geändert wurde, nachdem ich eine Anfrage gestellt habe?Komponententest owin Middleware, die Abfragezeichenfolge setzt

public static void UseInjectQueryString(this IAppBuilder app) 
{   
    app.Use(async (context, next) => 
      { 
       // Some code here 
       if (context.Environment.ContainsKey("owin.RequestQueryString")) 
       { 
         var existingQs = context.Environment["owin.RequestQueryString"]; 
         var parser = new UrlParser(existingQs.ToString()); 
         parser[Constants.AuthorizeRequest.AcrValues] = newAcrValues; 

         context.Environment.Remove("owin.RequestQueryString"); 
         context.Environment["owin.RequestQueryString"] = parser.ToString(); 
        } 
      } 

    await next(); 
}); 

Unit-Test:

[TestMethod] 
public async Task SomeTest() 
{ 
    using (var server = TestServer.Create(app => 
          {     
           //.... injecting middleware.. 
          })) 
    { 
     HttpResponseMessage response = await server.CreateRequest("core/connect/token?client_id=clientStub").GetAsync(); 
    } 
} 

Antwort

1

Ich würde die Middleware-Refactoring, so dass Sie es außerhalb der Pipeline testen. Zum Beispiel könnten Sie es wie folgt strukturiert:

public static class InjectQueryStringMiddleware 
{ 
    public static void InjectQueryString(IOwinContext context) 
    { 
     if (context.Environment.ContainsKey("owin.RequestQueryString")) 
     { 
      var existingQs = context.Environment["owin.RequestQueryString"]; 
      var parser = new UrlParser(existingQs.ToString()); 
      parser[Constants.AuthorizeRequest.AcrValues] = newAcrValues; 

      context.Environment.Remove("owin.RequestQueryString"); 
      context.Environment["owin.RequestQueryString"] = parser.ToString(); 
     } 
    } 

    public static void UseInjectQueryString(this IAppBuilder app) 
    { 
     app.Use(async (context, next) => 
     { 
      // some code here 
      InjectQueryString(context); 
     } 
    } 
} 

Jetzt können Sie InjectQueryString testen, und dass es das Richtige tut den Kontext, ohne die gesamte Pipeline erstellen zu müssen.

+0

Das ist nett. Also hier sollte ich UnitjectQueryString-Methode nur Unit-Test durch Mocking Kontext und nicht TestServer.Create Methode zum Erstellen und Instanz des Servers zu testen. Ist das korrekt? Wenn das der Fall ist, wie kann ich folgende Zeilen Code app.Use (async (Kontext abdecken, next) => { // einige Code hier InjectQueryString (Kontext); } – Shetty

+0

Sie dies nicht tun, es sei denn, '//Irgendein Code hier ist eigentlich etwas, das es wert ist, getestet zu werden (und dann kann man das auf ähnliche Weise ausheben), dieser Code ist so trivial, dass man ihn (Einheit) nicht testen muss. Natürlich, wenn das nicht funktioniert Eine Funktionalität, die auf der Abfrage-Injektion basiert, wird später in der Pipeline fehlschlagen, sodass ein Integrationstest (manuell oder automatisch) eines größeren Teils Ihres Systems dies problemlos abdecken sollte. –

Verwandte Themen