设置查询字符串的单元测试owin中间件

Unit testing owin middleware which sets query string

我有一个 owin 中间件,它检查查询字符串中的特定值,并更新查询字符串中的另一个值。我正在使用 Microsoft.OWin.Testing 来调用这个中间件,然后发出请求。我如何在发出请求后准确检查查询字符串是否已更改。

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();
});

单元测试:

[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();
    }
}

我会重构中间件,以便您可以在管道外对其进行测试。例如,您可以这样构造它:

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);
        }
    }
}

现在您可以测试 InjectQueryString 并且它对上下文执行正确的操作,而无需创建整个管道。