ASP.NET Core 6 整合測試存取依賴注入服務

在上一篇 ASP.NET Core 6 API 整合測試示範(NUnit) 中有示範建立測試專案、測試 API,不過通常測試中還會需要再讀取程式中的其他服務,本篇就來示範。

最簡單測試用 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>();
    

留言