使用 Mock 为带有 dot net 6.0 和工作单元的 Web API 项目编写 TDD 测试

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

我有一个 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.这个方法适合测试吗?

.net-6.0 moq webapi unit-of-work web-api-testing
1个回答
0
投票

默认情况下,

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);

如果不是,请根据需要进行调整。

© www.soinside.com 2019 - 2024. All rights reserved.