方案一:万物皆可Mock
Mock<IBlogArticleServices> mockBlogSev = new Mock<IBlogArticleServices>();
Mock<ILogger<BlogController>> mockLogger = new Mock<ILogger<BlogController>>();
BlogController blogController;
private IBlogArticleServices blogArticleServices;
DI_Test dI_Test = new DI_Test();
public BlogController_Should()
{
mockBlogSev.Setup(r => r.Query());
var container = dI_Test.DICollections();
blogArticleServices = container.Resolve<IBlogArticleServices>();
blogController = new BlogController(mockLogger.Object);
}
方案二:实例化TestServer对象
public TestServer CreateServer()
{
var path = Assembly.GetAssembly(typeof(CatalogScenariosBase))
.Location;
var hostBuilder = new WebHostBuilder()
.UseContentRoot(Path.GetDirectoryName(path))
.ConfigureAppConfiguration(cb =>
{
cb.AddJsonFile("appsettings.json", optional: false)
.AddEnvironmentVariables();
})
.UseStartup<Startup>();
var testServer = new TestServer(hostBuilder);
testServer.Host
.MigrateDbContext<CatalogContext>((context, services) =>
{
var env = services.GetService<IWebHostEnvironment>();
var settings = services.GetService<IOptions<CatalogSettings>>();
var logger = services.GetService<ILogger<CatalogContextSeed>>();
new CatalogContextSeed()
.SeedAsync(context, env, settings, logger)
.Wait();
})
.MigrateDbContext<IntegrationEventLogContext>((_, __) => { });
return testServer;
}
using (var server = CreateServer())
{
var response = await server.CreateClient()
.GetAsync(Get.ItemById(1));
response.EnsureSuccessStatusCode();
}
public IServiceProvider ConfigureServices(IServiceCollection servic
{
// 自定义服务扩展
services.AddAppInsight(Configuration)
// and so on...
.AddCustomMVC(Configuration);
// 使用Autofac依赖注入容器
var container = new ContainerBuilder();
container.Populate(services);
return new AutofacServiceProvider(container.Build());
}
方案三:使用.UseTestServer()
public static IHostBuilder GetTestHost()
{
return new HostBuilder()
//替换autofac作为DI容器
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.UseTestServer()
.UseStartup<Startup>();
})
.ConfigureAppConfiguration((host, builder) =>
{
builder.SetBasePath(Directory.GetCurrentDirectory());
builder.AddJsonFile("appsettings.json", optional: true);
builder.AddEnvironmentVariables();
});
}
using var server = await ArticleScenariosBase.GetTestHost().StartAsync();
// Action 发起接口请求
var response = await server.GetTestClientWithToken()
.GetAsync("/api/blogs?page=1&pageSize=5");
// Assert 确保接口状态码是200
response.EnsureSuccessStatusCode();
编者按:Blog.Core开源三周年
【原料】
个人开源项目Blog.Core马上就已经开源三周年了,经过许许多多的小伙伴功能努力的结果,希望给ASP.NET Core在国内的推广,提供一个落地级别的案例。
【制法】
A、累计提交上千次Commit;
B、配合前、后、认证、鉴权一体化方案;
C、不完全统计,被60+公司使用中;
【调味】
1.希望更多的小伙伴参与并提交PR。
2.希望更多的公司和组织使用,提供宝贵生产意见。
3.希望可以得到组织的孵化,让项目更进一步,有意者可以联系我。
Tips: 九月新内容,敬请期待。
HAPPY EVEY DAY!