在上一篇 ASP.NET Core 6 API 整合測試示範(NUnit) 中有示範建立測試專案、測試 API,不過通常測試中還會需要再讀取程式中的其他服務,本篇就來示範。
最簡單測試用 UserService:
在測試中取得:
如果是使用 AddScoped ,則會拋出下面的例外:
在測試中取得:
方法一:
方法二:
最簡單測試用 UserService:
public class UserService
{
public string GetData()
{
return "UserService.GetData()";
}
}
取得單例內容
在 Program.cs 中使用 Singleton 注入
builder.Services.AddSingleton<UserService>();
在測試中取得:
public class Tests
{
private WebApplicationFactory<Program> _factory = null!;
private UserService _userService = null!;
[OneTimeSetUp]
public void Init()
{
_factory = new WebApplicationFactory<Program>();
_userService = _factory.Services.GetRequiredService<UserService>();
}
[Test]
public void Test1()
{
string data = _userService.GetData();
Console.WriteLine(data);
}
}
如果是使用 AddScoped ,則會拋出下面的例外:
System.InvalidOperationException : Cannot resolve scoped service
取得 Scoped 內容
在 Program.cs 中使用 Singleton 注入
builder.Services.AddScoped<UserService>();
在測試中取得:
public class Tests
{
private WebApplicationFactory<Program> _factory = null!;
private UserService _userService = null!;
[OneTimeSetUp]
public void Init()
{
_factory = new WebApplicationFactory<Program>();
var scope = _factory.Services.CreateScope();
_userService = scope.ServiceProvider.GetRequiredService<UserService>();
}
[Test]
public void Test1()
{
string data = _userService.GetData();
Console.WriteLine(data);
}
}
取得 Transient 內容
上面兩個方法都可以方法一:
_userService = _factory.Services.GetRequiredService<UserService>();
方法二:
var scope = _factory.Services.CreateScope();
_userService = scope.ServiceProvider.GetRequiredService<UserService>();
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com