我已经用.net core 3.0preview 2更新了我的网站,我想用一个testserver进行集成测试。在.NET Core2.2中,我可以使用WebApplicationFactory<Startup>
由于WebHostBuilder
即将被弃用(有关更多详细信息,请参见(https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-2.2&tabs=visual-studio),因此我现在要跟进并实现新的泛型HostBuilder
。它对启动网站非常有用,但当我启动集成测试时它会崩溃。我知道WebApplicationFactory
确实使用WebHostBuilder
这就是它崩溃的原因,但我不知道如何将其更改为泛型HostBuilder
。
下面是我在.NET Core 2.2中使用的代码:
namespace CompX.FunctionalTest.Web.Factory
{
public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<Startup>
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureServices(services =>
{
// Create a new service provider.
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkInMemoryDatabase()
.BuildServiceProvider();
// Add a database context (ApplicationDbContext) using an in-memory
// database for testing.
services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseInMemoryDatabase("InMemoryDbForTesting");
options.UseInternalServiceProvider(serviceProvider);
});
services.AddDbContext<AppIdentityDbContext>(options =>
{
options.UseInMemoryDatabase("Identity");
options.UseInternalServiceProvider(serviceProvider);
});
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<AppIdentityDbContext>()
.AddDefaultTokenProviders();
// Build the service provider.
var sp = services.BuildServiceProvider();
// Create a scope to obtain a reference to the database
// context (ApplicationDbContext).
using (var scope = sp.CreateScope())
{
var scopedServices = scope.ServiceProvider;
var db = scopedServices.GetRequiredService<ApplicationDbContext>();
var loggerFactory = scopedServices.GetRequiredService<ILoggerFactory>();
var logger = scopedServices.GetRequiredService<ILogger<CustomWebApplicationFactory<TStartup>>>();
// Ensure the database is created.
db.Database.EnsureCreated();
try
{
// Seed the database with test data.
var userManager = scopedServices.GetRequiredService<UserManager<ApplicationUser>>();
AppIdentityDbContextSeed.SeedAsync(userManager).GetAwaiter().GetResult();
}
catch (Exception ex)
{
logger.LogError(ex, $"An error occurred seeding the database with test messages. Error: {ex.Message}");
}
}
});
}
}
}
我试过使用
TestServers
fromMicrosoft.AspNetCore.TestHost
,但它需要new WebHostBuilder()
作为参数。我还试图将此作为参数传递,但效果不太理想:
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
它找不到
.ConfigureWebHostDefaults()
函数。是否有人成功地在.NET Core 3.0中实现了测试服务器?
谢谢!
PS:我对.NET核心有点陌生
编辑:
这是我从尝试创建新服务器的所有方法中得到的错误:
这里是
program.cs
namespace CompX.Web
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
以下是我在github上创建的问题:
https://github.com/aspnet/AspNetCore/issues/7754
最佳答案
我终于在3.0里学会了怎么做。
以下是有关如何为任何需要解决方案的人执行此操作的完整演练:
您需要至少有.NET Core 3.0.0-Preview2,因为他们在这个预览(https://github.com/aspnet/AspNetCore/pull/6585)中添加了WebApplicationFactory
和IHostbuilder
。你可以在这里找到:https://dotnet.microsoft.com/download/dotnet-core/3.0
至少将这些软件包升级到3.0.0版(https://github.com/aspnet/AspNetCore/issues/3756和https://github.com/aspnet/AspNetCore/issues/3755):Microsoft.AspNetCore.App Version=3.0.0-preview-19075-0444
Microsoft.AspNetCore.Mvc.Testing Version= 3.0.0-preview-19075-0444
Microsoft.Extensions.Hosting Version=3.0.0-preview.19074.2
删除现在包含在Microsoft.AspNetCore.App
中的不推荐使用的包:Microsoft.AspNetCore Version=2.2.0
Microsoft.AspNetCore.CookiePolicy Version=2.2.0
Microsoft.AspNetCore.HttpsPolicy Version=2.2.0
Microsoft.AspNetCore.Identity Version=2.2.0
如果您在services.AddIdentity
生成器中使用了WebApplicationFactory<Startup>
,则需要将其删除。否则,将出现一个新的错误,说明您已经为Identity.Application
使用了该方案。看起来新的WebApplicationFactory
正在使用Startup.cs
中的那个。
我没有别的事要修改。
希望对一些人有帮助!
更新:
在我不得不使用另一个集成c文件(例如LoginTest.cs
和ManageTest.cs
)之前,它工作得很好。问题是当我运行测试时,它会无限循环,直到我按下ctrl+c。
之后,它将显示拒绝访问错误。
再次,我不得不从我的WebApplicationFactory
中移除一些东西,种子:
try
{
// Seed the database with test data.
var userManager = scopedServices.GetRequiredService<UserManager<ApplicationUser>>();
AppIdentityDbContextSeed.SeedAsync(userManager).GetAwaiter().GetResult();
}
catch (Exception ex)
{
logger.LogError(ex, $"An error occurred seeding the database with test messages. Error: {ex.Message}");
}
看起来新的
WebApplicationFactory
试图为每个工厂重新创建usermanager。我用guid.newguid()替换了我的种子用户帐户。我花了点时间才弄明白。希望它能再次帮助别人。
关于c# - 带有通用IHostBuilder的.Net核心集成TestServer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54792658/