.Net Core Integration TestServer 与 Generic IHostBuilder
.Net Core Integration TestServer with Generic IHostBuilder
我已经使用 .Net Core 3.0 预览版 2 更新了我的网站,我想使用 TestServer 进行 集成测试 。在 .Net Core 2.2 中,我已经能够使用 WebApplicationFactory<Startup>
由于WebHostBuilder
即将被弃用(更多细节见(https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-2.2&tabs=visual-studio)),我现在想跟进并实现新的Generic 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}");
}
}
});
}
}
}
我尝试使用 Microsoft.AspNetCore.TestHost
中的 TestServers
,但它需要 new WebHostBuilder()
作为参数。
我也试过将其作为参数传递,但效果不佳:
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
找不到 .ConfigureWebHostDefaults()
函数。
有人在 .Net Core 3.0 中成功实现了测试服务器吗?
非常感谢!
PS : 我对 .Net Core 有点陌生
编辑:
这是我从尝试创建新服务器的所有方法中得到的错误:
这是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,因为他们添加了 WebApplicationFactory
和 IHostbuilder
此预览(https://github.com/aspnet/AspNetCore/pull/6585). You can find it here : https://dotnet.microsoft.com/download/dotnet-core/3.0
将至少这些软件包升级到版本 3.0.0 (https://github.com/aspnet/AspNetCore/issues/3756 and 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
如果您在 WebApplicationFactory<Startup>
生成器中使用 services.AddIdentity
,则需要将其删除。否则,您将收到一个新错误,提示您 已经为 Identity.Application
使用了该方案 。看起来新的 WebApplicationFactory
现在正在使用 Startup.cs
的那个。
我没有其他要修改的东西。
希望对某些人有所帮助!
更新:
它一直运行良好,直到我不得不使用另一个集成 C# 文件(例如 LoginTest.cs
和 ManageTest.cs
)。问题是当我 运行 我的测试时,它会无限循环,直到我按下 CTRL + C。
之后,它会显示 Access Denied 错误。
再一次,我不得不从我的 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
正在尝试为每个工厂重新创建用户管理器。我用 Guid.NewGuid().
替换了我的种子用户帐户
我花了一段时间才弄明白。希望它能再次帮助某人。
我已经使用 .Net Core 3.0 预览版 2 更新了我的网站,我想使用 TestServer 进行 集成测试 。在 .Net Core 2.2 中,我已经能够使用 WebApplicationFactory<Startup>
由于WebHostBuilder
即将被弃用(更多细节见(https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-2.2&tabs=visual-studio)),我现在想跟进并实现新的Generic 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}");
}
}
});
}
}
}
我尝试使用 Microsoft.AspNetCore.TestHost
中的 TestServers
,但它需要 new WebHostBuilder()
作为参数。
我也试过将其作为参数传递,但效果不佳:
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
找不到 .ConfigureWebHostDefaults()
函数。
有人在 .Net Core 3.0 中成功实现了测试服务器吗? 非常感谢!
PS : 我对 .Net Core 有点陌生
编辑:
这是我从尝试创建新服务器的所有方法中得到的错误:
这是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,因为他们添加了
WebApplicationFactory
和IHostbuilder
此预览(https://github.com/aspnet/AspNetCore/pull/6585). You can find it here : https://dotnet.microsoft.com/download/dotnet-core/3.0将至少这些软件包升级到版本 3.0.0 (https://github.com/aspnet/AspNetCore/issues/3756 and 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
如果您在
WebApplicationFactory<Startup>
生成器中使用services.AddIdentity
,则需要将其删除。否则,您将收到一个新错误,提示您 已经为Identity.Application
使用了该方案 。看起来新的WebApplicationFactory
现在正在使用Startup.cs
的那个。
我没有其他要修改的东西。 希望对某些人有所帮助!
更新:
它一直运行良好,直到我不得不使用另一个集成 C# 文件(例如 LoginTest.cs
和 ManageTest.cs
)。问题是当我 运行 我的测试时,它会无限循环,直到我按下 CTRL + C。
之后,它会显示 Access Denied 错误。
再一次,我不得不从我的 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
正在尝试为每个工厂重新创建用户管理器。我用 Guid.NewGuid().
我花了一段时间才弄明白。希望它能再次帮助某人。