.Net core webapi的常用Test方法

第一种:使用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);
}
原文地址:https://www.cnblogs.com/mailaidedt/p/11642595.html