如何在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
相关产品推荐
相关产品推荐

