关于带有通用IHostBuilder的c#:. Net核心集成TestServer

.Net Core Integration TestServer with Generic IHostBuilder

我已经使用.Net Core 3.0预览版2更新了我的网站,并且希望使用TestServer进行集成测试。在.Net Core 2.2中,我已经能够使用WebApplicationFactory<Startup>

因为WebHostBuilder即将被弃用(请参阅(https://docs.microsoft.com/zh-cn/aspnet/core/migration/22-to-30?view=aspnetcore-2.2


我终于在3.0中获得了操作方法。
这是如何为需要解决方案的任何人做到的完整演练:

  • 您需要拥有至少.Net Core 3.0.0-preview2,因为他们在此预览中添加了WebApplicationFactoryIHostbuilder(https://github.com/aspnet/AspNetCore/pull/6585)。您可以在这里找到它: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
  • 如果您在WebApplicationFactory<Startup>构建器中使用services.AddIdentity,则需要将其删除。否则,将出现一个新错误,表明您已经将该方案用于Identity.Application。看来新的WebApplicationFactory现在正在使用Startup.cs中的那个。

  • 我别无他法。
    希望对某些人有帮助!

    更新:

    在我不得不使用另一个Integration C#文件(例如LoginTest.csManageTest.cs)之前,它一直运行良好。问题是,当我运行测试时,它将无限循环直到我按下CTRLC。
    之后,它将显示"访问被拒绝"错误。

    再一次,我不得不从我的WebApplicationFactory中除去种子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                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()替换了种子用户帐户。

    花点时间来弄清楚。希望它可以再次帮助某人。