ASP.NET Core 集成测试中模拟登录用户的一种姿势

不管哪种用户验证方式,最终都是在验证成功后设置 HttpContext.User ,后续处理环节通过 HttpContext.User 获取用户信息。如果能直接修改 HttpContext.User ,就能达到模拟登录的目的,而 ASP.NET Core 的中间件(middleware)天生具备的可以任意修改 HttpContext 的能力,让实现这个想法不费吹灰之力。

首先实现一个模拟登录用户并修改 HttpContext.User 的中间件。

app.Use(async (context, next) =>
{
    var claims = new Claim[] { new Claim(ClaimTypes.Name, "cnblogs") };
    var claimsIdentity = new ClaimsIdentity(claims, "Basic");
    var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
    context.User = claimsPrincipal;
    await next();
});

然后通过 IStartupFilter 注册上面的中间件,这样可以确保它先于 Startup.Configure 中注册的中间件。

public class FakeUserStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return app =>
        {
            //app.Use(...);
            next(app);
        };
    }
}

最后通过重写 WebApplicationFactory 的 ConfigureWebHost 方法注册 IStartupFilter 的实现。

public class StoreWebAppFactory : WebApplicationFactory<Startup>
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.ConfigureServices(services =>
        {
            services.AddTransient<IStartupFilter, FakeUserStartupFilter>();
        });

        base.ConfigureWebHost(builder);
    }
}

这样就轻松搞定了。 

posted @ 2019-11-13 15:31  dudu  阅读(...)  评论(... 编辑 收藏