我有一个 Web API 项目,我使用 Unit Of Work 模式和 dot net 6.0 并想为其编写测试。
我有一个如下所示的控制器和一个用于身份验证的功能:
public AuthController(IUnitOfWork uow, IStringLocalizer<SharedTranslate> localizer, IJwtAuthenticatorManager jwtAuthenticatorManager) : base(uow, localizer)
{
//...
}
[HttpPost("authenticate")]
public async Task<IActionResult> Authenticate([FromBody] UserLoginViewModel Request)
{
User user = await _uow.UserRepository.GetAsync(u => u.Username == Request.Username);
//...
}
对于 Moq 的单元测试,我使用以下代码:
var unitOfWork = new Mock<IUnitOfWork>();
var localizor = new Mock<IStringLocalizer<SharedTranslate>>();
var jwtManager = new Mock<IJwtAuthenticatorManager>();
var controller = new AuthController(unitOfWork.Object, localizor.Object, jwtManager.Object);
UserLoginViewModel userLoginViewModel = new UserLoginViewModel
{
Username = "test",
Password = "test"
};
var result = await controller.Authenticate(userLoginViewModel);
当我调试它时,它无法连接到数据库(例如Authenticate功能中的对象用户为空)并检查。
1.问题是什么?
2.这个方法适合测试吗?
默认情况下,
unitOfWork.UserRepository
将是null
,即使不是,Moq也不知道当调用GetAsync
方法时要返回什么。你必须告诉它:
var unitOfWork = new Mock<IUnitOfWork>();
unitOfWork
.Setup(uow => uow.UserRepository.GetAsync(It.IsAny<Func<User, bool>>()))
.ReturnsAsync(new User());
这假设
GetAsync
的定义如下:
Task<User> GetAsync(Func<User, bool> predicate);
如果不是,请根据需要进行调整。