using Autofac.Extensions.DependencyInjection; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.TestHost; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; using MS.Component.Jwt; using MS.Component.Jwt.UserClaim; using MS.WebApi; using System.Net.Http; namespace WebApiTests { public static class TestHostBuild { public static readonly JwtService jwtService = new JwtService(Options.Create(new JwtSetting { Audience = "MS.Audience", Issuer = "MS.WebHost", LifeTime = 1440, SecurityKey = "MS.WebHost SecurityKey"//此处内容需和服务器appsettings.json中保持一致 })); public static readonly UserData userData = new UserData { Account = "test", Email = "test@qq.com", Id = 1, Name = "测试用户", Phone = "123456789111", RoleDisplayName = "testuserRole", RoleName = "testuser" };//测试用户的数据,也可以改成真实的数据,看需求 public static IHostBuilder GetTestHost() { //代码和网站Program中CreateHostBuilder代码很类似,去除了AddNlogService以免跑测试生成很多日志 //如果网站并没有使用autofac替换原生DI容器,UseServiceProviderFactory这句话可以去除 //关键是webBuilder中的UseTestServer,建立TestServer用于集成测试 return new HostBuilder() .UseServiceProviderFactory(new AutofacServiceProviderFactory())//替换autofac作为DI容器 .ConfigureWebHostDefaults(webBuilder => { webBuilder .UseTestServer()//关键时多了这一行建立TestServer .UseStartup(); }); } /// /// 生成带token的httpclient /// /// /// public static HttpClient GetTestClientWithToken(this IHost host) { var client = host.GetTestClient(); client.DefaultRequestHeaders.Add("Authorization", $"Bearer {GenerateToken()}");//把token加到Header中 return client; } /// /// 生成jwt令牌 /// /// public static string GenerateToken() { return jwtService.BuildToken(jwtService.BuildClaims(userData)); } } }