我將嘗試使用更易于理解的示例代碼來展示我的問題。
我曾經WebApplicationFactory開發過我的驗收測驗。假設我有典型的最小 Program.cs 并帶有以下行來注冊我的模塊之一:
builder.Services.RegisterModule<StartupRegistrationModule>(builder.Configuration, builder.Environment);
這個模塊是這樣宣告的:
internal sealed class StartupRegistrationModule : IServiceRegistrationModule
{
public static Dictionary<string, string> _dictionary = new();
public void Register(IServiceCollection services, IConfiguration configuration, IHostEnvironment hostEnvironment)
{
// Lot of modules being registered
_dictionary.Add("key", "value");
}
}
我的一個測驗檔案是這樣的:
public sealed class MyTests : AcceptanceTestBase
{
[Fact]
public void Test1()
{
// arrange
// act
// assert
}
[Fact]
public void Test2()
{
// arrange
// act
// assert
}
[Fact]
public void Test3()
{
// arrange
// act
// assert
}
}
并且AcceptanceTestBase是:
public abstract class AcceptanceTestBase : IDisposable
{
protected HttpClient _httpClient;
protected WebApplicationFactory<Program> _webApplicationFactory;
public AcceptanceTestBase()
{
_webApplicationFactory = new WebApplicationFactory<Program>()
.WithWebHostBuilder(builder =>
{
// ... Configure test services
});
_httpClient = _webApplicationFactory.CreateClient();
}
public void Dispose()
{
_httpClient.Dispose();
_webApplicationFactory.Dispose();
}
}
如果我嘗試執行所有這些測驗,我的測驗將在第二次測驗運行中失敗,因為 WebApplicationFactory 正在嘗試再次構建應用程式,但它已經在字典中擁有密鑰并且它將失敗。有關該問題的更多理解,請參見影像。

所以我的問題是,如何在不同范圍內構建應用程式以不共享此字典狀態?
謝謝 :)
更新:真正的靜態字典保存在這個 nuget 包后面,它跟蹤我所有的斷路器策略狀態。實際上,我的測驗甚至不需要 HttpClients,但沒有找到洗掉它們并且不加載它的方法。我嘗試洗掉所有 HttpClients 以查看它是否也洗掉了它們的依賴項,但它似乎并沒有成功。

uj5u.com熱心網友回復:
這是因為您正在使用:
internal sealed class StartupRegistrationModule : IServiceRegistrationModule
{
/// .. static here
public static Dictionary<string, string> _dictionary = new();
public void Register(IServiceCollection services, IConfiguration configuration, IHostEnvironment hostEnvironment)
{
// Lot of modules being registered
_dictionary.Add("key", "value");
}
}
static Dictionary因為它們在同一個行程中運行,所以在您的所有測驗中共享。每個測驗都會啟動一個新的 (Test-)WebHost,但字典保持不變。
我的建議是不要在 DI 背景關系中的任何地方使用靜態來防止這種隱藏的陷阱。
我不知道您Dictionary在這里的目的,但也許您可以將其提取到單例注冊中,您可以在每次新測驗/啟動時在您的 (Test.)WebHost 中替換它?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/520980.html
標籤:测试.net-coreasp.net-core-webapixunitasp.net-core-6.0
下一篇:在Go中測驗GRPC流發送功能
