gpt4 book ai didi

asp.net-core - ASP.NET Core 集成测试中的 WebApplicationFactory 和 TestServer

转载 作者:行者123 更新时间:2023-12-05 05:05:29 24 4
gpt4 key购买 nike

我有两个定义如下的集成测试类。当我在 ApiControllerIT 中运行测试时,所有测试都成功运行。 FoundationControllerIT 也是如此。但是,当我同时运行两者时(通过运行封闭文件夹),测试失败。

错误信息是:

Scheduler with name 'DefaultQuartzScheduler' already exists.

我的 Startup.cs 文件中有这个定义:

services.AddSingleton (IHostedService, QuartzHostedService);

很明显这一行导致了问题(如果我删除这一行,所有测试一起运行正常)。所以我的问题是——我是 Java 的新手……所以我对 .NET Core Integ 测试框架没有很好的了解,但我的理解是——TestServer 是为每个测试类创建的,例如一个 TestServer 用于 ApiControllerIT,另一个用于 FoundationControllerIT。这是不正确的吗?我只是很沮丧,我怎么会收到消息:

Scheduler with name 'DefaultQuartzScheduler' already exists.

当我运行两个单独的测试类时??为什么 TestServer 会互相干扰?

public class ApiControllerIT : IClassFixture<WebApplicationFactory<Startup>>
{
private readonly WebApplicationFactory<Startup> _factory;

public ApiControllerIT(WebApplicationFactory<Startup> factory)
{
_factory = factory;
}

// tests ...

}

public class FoundationControllerIT : IClassFixture<WebApplicationFactory<Startup>>
{
private readonly WebApplicationFactory<Startup> _factory;

public FoundationControllerIT(WebApplicationFactory<Startup> factory)
{
_factory = factory;
}

// tests ...

}

最佳答案

我可能有点晚了,但我也遇到了这个问题,将来它可能对其他人有用。

问题来了,因为 WebApplicationFactory 将创建您的 Startup 的两个实例类(class)。这与您的正常服务启动截然不同,您只有一个 Startup 的实例。 .

(在您的情况下可能会有所不同,但我在整个应用程序中使用 Singleton 实例来创建和管理我的调度程序。)

WebApplicationFactory 还调用 ConfigureServicesConfigure在他们两个上。所以即使是你的单例也会出现两次,每个人一个Startup实例。这不是问题,因为 Startup实例将有自己的 ServiceProvider。如果(多个)单例实例访问某些东西的相同静态属性,它只会出现问题。在我们的例子中,这是 SchedulerBuilder使用 SchedulerFactory使用 SchedulerRepository在 Quartz 中,它是一个>真正的<单例并使用此代码:

/// <summary>
/// Gets the singleton instance.
/// </summary>
/// <value>The instance.</value>
public static SchedulerRepository Instance { get; } = new SchedulerRepository();

这意味着您的独立单例类仍然使用相同的 SchedulerRepository在 Quartz 中,这解释了为什么会出现异常。


根据您在测试中测试的内容,您可以选择一些方法来解决此问题。

  1. SchedulerRepository有一个查找方法,您可以使用它来检查调度程序是否已由另一个实例创建:public virtual Task<IScheduler?> Lookup(string schedName, CancellationToken cancellationToken = default) - 所以你要么只使用现有的调度器,要么生成另一个具有不同名称的调度器
  2. 捕获异常,什么都不做。 (这只有在您的测试不需要 Quartz 时才真正有意义,这可能不太可能,但我仍然想列出这个选项)

我无法告诉您什么对您的情况最有意义,因为这完全取决于您的应用程序做什么以及您想要测试什么,但我可能会坚持使用选项 1 的一种变体。

关于asp.net-core - ASP.NET Core 集成测试中的 WebApplicationFactory 和 TestServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60467545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com