【问题标题】:Unit Test - Assert object returned by a controller action单元测试 - 断言由控制器操作返回的对象
【发布时间】:2017-08-26 12:16:20
【问题描述】:

如何在不更改控制器操作中的任何代码的情况下检查作为 OkObjectResult 一部分返回的值是否为 2?

这是我的控制器操作

public IActionResult GetUserNames()
{
    var users = _repository.GetUsers();
    return Ok(users.Select(u => u.Name));
}

我的单元测试是这样的

[Fact]
public void GetUserNames_ValidRequest_ShouldReturnOk()
{
    _repository
        .Setup(r => r.GetUsers())
        .Return(new List<User> 
            {
                new User { Name = "SomeRandomName" },
                new User { Name = "SomeRandomName2" }  
            });

    var result = _controller.GetUserNames();

    result.Should().BeOfType<OkObjectResult>();
    // Code to check if 2 names are returned
}

我在单元测试中使用了 Mock 和 FluentAssertions。

【问题讨论】:

  • 相当无意义的测试。所有这一切都是检查您的控制器的方法之一是否返回 Ok 结果。与有效请求无关。此外,除非有一些完全的白痴出现并编辑您的代码,因此它返回一个不成功的状态代码,这是一个毫无意义的测试用例 - 您至少应该对您的同事有一定程度的信心。我会更担心测试实际的业务逻辑而不是控制流。

标签: c# unit-testing asp.net-core asp.net-core-webapi


【解决方案1】:

你应该可以做这样的事情:

var objectResult = Assert.IsType<OkObjectResult>(result);
var model = Assert.IsAssignableFrom<List<string>>(objectResult.Value);
Assert.Equal(2, model.Count);

【讨论】:

  • 谢谢。为我节省了 99999 小时的调试时间。
猜你喜欢
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多