ActionResult<bool> 中的隐式转换运算符不起作用

Implicit cast operator in ActionResult<bool> not working

我正在关注 this guide 来构建我的控制器。我执行以下操作。

这是我的控制器:

// GET api/sth/{sthId}/isValid
[HttpGet("{sthId: int}/isValid")]
[ProducesResponseType(StatusCodes.Status200OK)]
[MyAuthorizeFilter]
public ActionResult<bool> Whatever(int sthId)
{
    return this.myService.Whatever(sthId);
}

理论上,这应该转换为 Ok() ActionResult。但是,如果我编写以下单元测试:

[Fact]
public void Whatever()
{
    this.myServiceMock.Setup(x => x.Whatever(It.IsAny<int>())).Returns(true);

-> I DEBUG HERE ->  var result = this.myController.Whatever(1);

    Assert.IsType<OkObjectResult>(result);
    Assert.True((bool)result.Value);
}

我看到我的 result 确实是一个 ActionResult<bool>,它的 Value 正如预期的那样是 true,但是 result.Result 是空的。所以:没有 Ok 任何操作结果。

我错过了什么?我必须明确地写 return Ok() 才能得到它吗?用句

Implicit cast operators support the conversion of both T and ActionResult to ActionResult<T>. T converts to ObjectResult, which means return new ObjectResult(T); is simplified to return T;.

在文档中我认为没有必要...?

ActionResult<TValue> class:

wraps either an[sic] TValue instance or an ActionResult.

另见 source,它的构造函数分配 ValueResult,永远不会两者都分配。

如果未明确设置状态代码,MVC 管道将为响应分配成功状态代码。但我找不到该声明的文档。

这意味着在此测试中获得的响应不会有状态代码或 OkActionResult 任何地方。您 可以 将其转换为 ObjectResult,但不会有状态代码。

如果您使用 swagger 之类的东西,您确实会从服务器获得 OK。

这发生在你身上是因为你不执行 http 请求你简单地调用一个方法(你的控制器方法)并且你得到一个 return 类型。您不创建 Web 服务器或其他东西,因此 .net 核心不会生成 http 状态代码。

如果您想获取状态代码,您应该使用 http 请求编写测试。通常,您可以查找邮递员之类的东西来执行测试。