c# - 如何测试返回 Ok(new { token = tokenStr }); 的函数

标签 c# .net api unit-testing xunit

这是我的 Controller 类的函数,我想测试它,但我不知道为什么检查 OkObject 为空。我需要一些建议和解决这个问题的方法:

[HttpGet]
        public async Task<IActionResult> LoginAsync(string phoneNumber, string pass)
        {
            User login = new User();
            login.Phone = phoneNumber;
            login.Password = pass;
            IActionResult response = Unauthorized();

            var user = await _loginService.AuthenticateUserAsync(login);
            if(user != null)
            {
                var tokenStr = _loginService.GenerateJWT(user);
                response = Ok(new { token = tokenStr });
            }
            return response;
        }

我的测试函数是:

[Fact]
        public async Task LoginAsync_ReturnOk()
        {
            var mock = new Mock<ILoginService>();

            var controller = new LoginController(mock.Object);

            var phone = "0123456789";
            var pass = "abc123";
            var okResult = await controller.LoginAsync(phone, pass);
            Assert.IsType<OkObjectResult>(okResult as OkObjectResult);


        }

我真的需要你们的帮助。

最佳答案

测试失败,因为模拟的依赖项尚未配置为当前测试用例的预期行为。

针对所述测试用例需求进行测试的主题

//...

 if(user != null)

//...

true,但未为测试用例配置_loginService

//...

var user = await _loginService.AuthenticateUserAsync(login);

//...

这意味着被测试的主体将返回UnauthorizedResult

这将导致 okResult as OkObjectResultnull

需要安排测试,以便测试用例在执行时能够按预期运行

[Fact]
public async Task LoginAsync_Should_Return_Ok() {
    // Arrange
    var mock = new Mock<ILoginService>();

    var user = new UserResult(); //Or what ever the actual user type is
    
    mock.Setup(_ => _.AuthenticateUserAsync(It.IsAny<User>()))
        .ReturnsAsync(user);

    string tokenStr = "some token value";

    mock.Setup(_ => _.GenerateJWT(user)).Returns(tokenStr);

    LoginController controller = new LoginController(mock.Object);

    string phone = "0123456789";
    string pass = "abc123";

    //Act
    IActionResult response = await controller.LoginAsync(phone, pass);

    //Assert
    OkObjectResult okResult = Assert.IsType<OkObjectResult>(response);
    
    //Optional: additional assertions for this test case
    dynamic value = okResult.Value;
    Assert.NotNull(value);

    string token = (string)value.token;
    Assert.Equal(token, tokenStr);
}

并且由于还可能出现未经授权的响应,因此这是涵盖该 Controller 操作的另一个测试用例

[Fact]
public async Task LoginAsync_Should_Return_Unauthorized() {
    //Arrange
    var mock = new Mock<ILoginService>();
    mock.Setup(_ => _.AuthenticateUserAsync(It.IsAny<User>()))
        .ReturnsAsync((UserResult)null); //Or what ever the actual user type is

    LoginController controller = new LoginController(mock.Object);

    string phone = "0123456789";
    string pass = "abc123";

    //Act
    IActionResult response = await controller.LoginAsync(phone, pass);

    //Assert
    Assert.IsType<UnauthorizedResult>(response);
}

关于c# - 如何测试返回 Ok(new { token = tokenStr }); 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71542937/

相关文章:

c# - 跨项目拆分命名空间

java - Rhapsody 插件测试

javascript - 如何将 jQuery ng-repeat {{x.something}} 传递给 javascript api url,如/api/get_now/{{x.something}}

c# - 如何构建一个允许我通过参数为 EF 传递多个包含的函数?

c# - 如何使类中的属性线程安全

python - 将文件作为输入参数的 API

c# - XAML 绑定(bind) : binding to properties of a "global" object

c# - DropdownListFor 所选值未在呈现的 html 中选择

c# - 在 .NET 中调用 COM 枚举器的正确方法是什么?

c# 泛型列表