第一种:使用ServicProviderHelper类,配置appsetting.json配置及依赖的服务
ServiceProviderHelper类,创建静态的ServiceProvider依赖注入服务器
public class ServiceProviderHelper { private static ServiceProvider _serviceProvider { get; set; } public static ServiceProvider ServiceProvider { get { if (_serviceProvider == null) { IConfiguration Configuration = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) .AddJsonFile("appsettings.json") .Build(); //IConfiguration Configuration = new ConfigurationBuilder().SetBasePath("appsettings.json").Build(); var services = new ServiceCollection(); services.AddMvc((mvcOption => { mvcOption.Filters.Add<ApiAuthFilter>(); mvcOption.Filters.Add<ApiExceptionFilter>(); })); services.ServiceCollectionInit(Configuration); services.DatabaseServiceInit<DbContext>(Sem.Common.DataBaseType.Greenplum, Configuration); services.TryAddTransient<IAccountMediaService, AccountMediaService>(); _serviceProvider = services.BuildServiceProvider(); } return _serviceProvider; } } }
第二种:创建 “测试服务”实例,进行调用
命名空间:Microsoft.AspNetCore.TestHost
类名:TestServer
构造函数或者实例变量中,创建HttpClient对象,也包括了ServiceProvider属性。
public (ITestOutputHelper ouput) { _output = ouput; var server = new TestServer(WebHost.CreateDefaultBuilder().UseStartup<StartupTest>()); //StartupTest为 StartUp启动类 Client = server.CreateClient(); _service = server.Host.Services;
#region 其他方式注入服务测试 //var _service = server.Host.Services.GetService<UserService>(); //var server = new TestServer(WebHost.CreateDefaultBuilder().UseStartup<Startup>()); //var _controller = server.Host.Services.GetService<ValuesController>(); //var httpContextAccessorMock = new Mock<IHttpContextAccessor>(); //httpContextAccessorMock.Setup(x => x.HttpContext.Request.Cookies["username"]).Returns("yubaolee"); //var testServer = new TestServer(WebHost.CreateDefaultBuilder() // .ConfigureServices(u => u.AddScoped(x => httpContextAccessorMock.Object)) // .UseStartup<Startup>()); //_service = server.Host.Services.GetService<UserService>(); #endregion } public HttpClient Client { get; }
使用方式:
HttpContent httpContent = new StringContent(JsonFormatter.SerializeObject(jsonObj, JsonFormatterOptions.IgnoreEmptyString & JsonFormatterOptions.IgnoreNull & JsonFormatterOptions.IgnoreZero), System.Text.Encoding.UTF8); httpContent.Headers.Add("T1","aaa"); httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); var response = await Client.PostAsync("/api/v1/xx", httpContent); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var result = await response.Content.ReadAsStringAsync(); _output.WriteLine(result);
遇到的问题:测试单独的Controller类中的api方法,TestServer 请求api地址,提示404
Test seperate library controller 404
在 StartupTest 的启动类中,addMvc服务的后面增加 AddApplicationPart,将对应controller的assembly导入即可.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddApplicationPart(typeof(ServiceHookController).Assembly);
}