我正在使用 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 方法?
要验证 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());
}
}