第一种:使用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);
}
来源:oschina
链接:https://my.oschina.net/u/4256405/blog/4306037