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

时间:2019-11-13
本文章向大家介绍ASP.NET Core 集成测试中模拟登录用户的一种姿势,主要包括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);
    }
}

这样就轻松搞定了。 

原文地址:https://www.cnblogs.com/dudu/p/11838952.html