如何验证ASP.NET Core API单元测试(NUnit)中的RefreshTokenForUser中调用了ValidateRefreshToken?

问题描述 投票:0回答:1

我正在使用 NUnit 为 ASP.NET Core API 编写单元测试。我有一个接口 IJwtManagerRepository ,其方法为 RefreshTokenForUser 和 ValidateRefreshToken。在 RefreshTokenForUser 中,实际实现使用可能为 null 的参数调用 ValidateRefreshToken。

public interface IJwtManagerRepository
{
    Task<(bool Success, string ErrorMessage, int ErrorCode)> RefreshTokenForUser(Account user, string refreshToken);
    Task<(bool Success, string ErrorMessage, int ErrorCode, bool IsExpired, RefreshToken RefreshTokenInDatabase)> ValidateRefreshToken(Account user, string refreshToken);
}

public class JwtManagerRepository : IJwtManagerRepository
{

private readonly WebApplicationFactory<Program> WebApplicationFactory;

public IJwtManagerRepository IJwtManagerRepository { get; set; }

    public async Task<(bool Success, string ErrorMessage, int ErrorCode)> RefreshTokenForUser(Account user, string refreshToken)
    {
        await ValidateRefreshToken(null, null); // Potentially null arguments
    }

    // Implementation of ValidateRefreshToken omitted
}

// Test Code (incomplete)
public class IJwtManagerRepositoryTests : IClassFixture<WebApplicationFactory<Program>>
{
    public IJwtManagerRepositoryTests(WebApplicationFactory<Program> webApplicationFactory)
{
    WebApplicationFactory = webApplicationFactory;
    var scope = WebApplicationFactory.Services.CreateScope();
    IJwtManagerRepository = scope.ServiceProvider.GetService<IJwtManagerRepository>();
} 

    [Fact]
    public async Task RevokeRefreshToken_Calls_ValidateRefreshToken()
    {
        // Arrange
        var account = await GetAccount(); // Replace with your logic to obtain account
        var refreshToken = ""; // Replace with actual refresh token

        await IJwtManagerRepository.RefreshTokenForUser(account, refreshToken);

        // How to verify ValidateRefreshToken was called?
    }

}

我的问题是:如何在测试中验证执行 RefreshTokenForUser 时是否实际调用了 ValidateRefreshToken 方法?

c# unit-testing asp.net-core mocking nunit
1个回答
0
投票

要验证 ValidateRefreshToken 在测试(NUnit)期间在 RefreshTokenForUser 中被调用,您可以使用 Mocking 技术。这将允许您创建模拟对象,其行为就像复杂的真实对象一样,并监视与它们的交互。 NUnit 本身不包含内置模拟库,因此您需要将 Moq 或其他模拟库添加到您的项目中。

安装起订量包。

这是使用起订量的示例代码:

using Moq;
using NUnit.Framework;
using System.Threading.Tasks;

public class IJwtManagerRepositoryTests : IClassFixture<WebApplicationFactory<Program>>
{
    private readonly WebApplicationFactory<Program> WebApplicationFactory;
    private Mock<IJwtManagerRepository> mockJwtManagerRepository;

    public IJwtManagerRepositoryTests(WebApplicationFactory<Program> webApplicationFactory)
    {
        WebApplicationFactory = webApplicationFactory;
        mockJwtManagerRepository = new Mock<IJwtManagerRepository>();
    } 

    [Test]
    public async Task RefreshTokenForUser_Calls_ValidateRefreshToken()
    {
        var account = await GetAccount(); 
        var refreshToken = "some_refresh_token";
        
 
        mockJwtManagerRepository.Setup(repo => repo.ValidateRefreshToken(null, null))
                                .ReturnsAsync((true, "", 0, false, new RefreshToken()));

          await mockJwtManagerRepository.Object.RefreshTokenForUser(account, refreshToken);
        mockJwtManagerRepository.Verify(repo => repo.ValidateRefreshToken(null, null), Times.Once());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.