TestHostBuild.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using Autofac.Extensions.DependencyInjection;
  2. using Microsoft.AspNetCore.Hosting;
  3. using Microsoft.AspNetCore.TestHost;
  4. using Microsoft.Extensions.Hosting;
  5. using Microsoft.Extensions.Options;
  6. using MS.Component.Jwt;
  7. using MS.Component.Jwt.UserClaim;
  8. using MS.WebApi;
  9. using System.Net.Http;
  10. namespace WebApiTests
  11. {
  12. public static class TestHostBuild
  13. {
  14. public static readonly JwtService jwtService = new JwtService(Options.Create(new JwtSetting
  15. {
  16. Audience = "MS.Audience",
  17. Issuer = "MS.WebHost",
  18. LifeTime = 1440,
  19. SecurityKey = "MS.WebHost SecurityKey"//此处内容需和服务器appsettings.json中保持一致
  20. }));
  21. public static readonly UserData userData = new UserData
  22. {
  23. Account = "test",
  24. Email = "test@qq.com",
  25. Id = 1,
  26. Name = "测试用户",
  27. Phone = "123456789111",
  28. RoleDisplayName = "testuserRole",
  29. RoleName = "testuser"
  30. };//测试用户的数据,也可以改成真实的数据,看需求
  31. public static IHostBuilder GetTestHost()
  32. {
  33. //代码和网站Program中CreateHostBuilder代码很类似,去除了AddNlogService以免跑测试生成很多日志
  34. //如果网站并没有使用autofac替换原生DI容器,UseServiceProviderFactory这句话可以去除
  35. //关键是webBuilder中的UseTestServer,建立TestServer用于集成测试
  36. return new HostBuilder()
  37. .UseServiceProviderFactory(new AutofacServiceProviderFactory())//替换autofac作为DI容器
  38. .ConfigureWebHostDefaults(webBuilder =>
  39. {
  40. webBuilder
  41. .UseTestServer()//关键时多了这一行建立TestServer
  42. .UseStartup<Startup>();
  43. });
  44. }
  45. /// <summary>
  46. /// 生成带token的httpclient
  47. /// </summary>
  48. /// <param name="host"></param>
  49. /// <returns></returns>
  50. public static HttpClient GetTestClientWithToken(this IHost host)
  51. {
  52. var client = host.GetTestClient();
  53. client.DefaultRequestHeaders.Add("Authorization", $"Bearer {GenerateToken()}");//把token加到Header中
  54. return client;
  55. }
  56. /// <summary>
  57. /// 生成jwt令牌
  58. /// </summary>
  59. /// <returns></returns>
  60. public static string GenerateToken()
  61. {
  62. return jwtService.BuildToken(jwtService.BuildClaims(userData));
  63. }
  64. }
  65. }