You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

验证RefreshTokenForUser调用ValidateRefreshToken的方法

要验证RefreshTokenForUser执行时确实调用了ValidateRefreshToken,你需要使用**Mock框架(比如Moq)**跟踪方法调用——直接使用真实的JwtManagerRepository实例无法捕获内部方法的调用情况。具体步骤如下:

1. 修改目标类,允许Mock内部方法

因为Moq只能拦截虚方法或接口方法,所以需要将JwtManagerRepository中的ValidateRefreshToken标记为virtual:

public class JwtManagerRepository : IJwtManagerRepository
{
    private readonly WebApplicationFactory<Program> _webApplicationFactory;

    // 注意:原代码中的IJwtManagerRepository属性疑似笔误,建议移除或修正
    public JwtManagerRepository(WebApplicationFactory<Program> webApplicationFactory)
    {
        _webApplicationFactory = webApplicationFactory;
    }

    public async Task<(bool Success, string ErrorMessage, int ErrorCode)> RefreshTokenForUser(Account user, string refreshToken)
    {
        await ValidateRefreshToken(null, null); // 调用内部方法
        // 其他业务逻辑...
        return (true, "", 0);
    }

    // 标记为virtual,让Moq可以拦截调用
    public virtual async Task<(bool Success, string ErrorMessage, int ErrorCode, bool IsExpired, RefreshToken RefreshTokenInDatabase)> ValidateRefreshToken(Account user, string refreshToken)
    {
        // 原有实现...
        return (true, "", 0, false, null);
    }
}

2. 编写测试用例

使用Moq创建JwtManagerRepository的Mock实例,开启CallBase = true以执行真实的RefreshTokenForUser逻辑,同时跟踪ValidateRefreshToken的调用:

public class JwtManagerRepositoryTests : IClassFixture<WebApplicationFactory<Program>>
{
    private readonly WebApplicationFactory<Program> _webApplicationFactory;

    public JwtManagerRepositoryTests(WebApplicationFactory<Program> webApplicationFactory)
    {
        _webApplicationFactory = webApplicationFactory;
    }

    [Fact]
    public async Task RefreshTokenForUser_Calls_ValidateRefreshToken_With_Null_Args()
    {
        // Arrange
        // 创建Mock实例,传入WebApplicationFactory依赖
        var mockJwtManager = new Mock<JwtManagerRepository>(_webApplicationFactory);
        // 开启CallBase,让真实的RefreshTokenForUser方法执行
        mockJwtManager.CallBase = true;

        var testAccount = await GetAccount(); // 你的账号获取逻辑
        var testRefreshToken = "dummy-token";

        // Act
        await mockJwtManager.Object.RefreshTokenForUser(testAccount, testRefreshToken);

        // Assert
        // 验证ValidateRefreshToken被调用一次,且参数为null、null
        mockJwtManager.Verify(
            repo => repo.ValidateRefreshToken(null, null),
            Times.Once,
            "ValidateRefreshToken未被调用,或调用次数/参数不符合预期"
        );
    }

    // 你的GetAccount实现
    private async Task<Account> GetAccount()
    {
        // 示例逻辑,替换为你的实际代码
        return new Account { Id = 1, Username = "test-user" };
    }
}

关键说明

  • CallBase = true:确保Mock实例执行真实的RefreshTokenForUser方法,而非默认的空实现。
  • Verify方法:用于检查目标方法是否按预期调用(次数、参数匹配),不符合时会抛出测试失败异常。
  • 如果ValidateRefreshToken是依赖注入的外部服务(而非当前类的方法),直接MockIJwtManagerRepository接口即可,无需修改原类。

内容的提问来源于stack exchange,提问作者user2877989

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 20:16:11