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

时间:2019-12-23 10:07:34

标签: asp.net-core .net-core asp.net-core-3.0

我正在遵循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()才能获得它?与句子

  

隐式强制转换运算符支持将TActionResult都转换为ActionResult<T>T转换为ObjectResult,这意味着return new ObjectResult(T);简化为return T;

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

2 个答案:

答案 0 :(得分:1)

ActionResult<TValue> class

  

包装 [sic] <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <EditText android:id="@+id/edit_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="5dp" android:layout_marginLeft="5dp" android:layout_marginTop="10dp" android:ems="10" android:hint="@string/Name" android:inputType="textPersonName" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Spinner android:id="@+id/spinner" android:layout_width="120dp" android:layout_height="50dp" android:layout_marginTop="4dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.883" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/btn_save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="76dp" android:layout_marginLeft="76dp" android:layout_marginTop="28dp" android:enabled="false" android:text="Save Data" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/edit_name" /> <EditText android:id="@+id/edit_desc" android:layout_width="match_parent" android:layout_height="60dp" android:ems="10" android:inputType="textMultiLine" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/btn_save" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recylerView" android:layout_width="match_parent" android:layout_height="550dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/edit_desc" app:layout_constraintVertical_bias="0.036" /> <Button android:id="@+id/btn_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="34dp" android:layout_marginLeft="34dp" android:layout_marginTop="28dp" android:layout_marginEnd="88dp" android:layout_marginRight="88dp" android:text="Delete Data" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/btn_save" app:layout_constraintTop_toBottomOf="@+id/spinner" /> </androidx.constraintlayout.widget.ConstraintLayout> 实例或TValue实例。

另请参见source,它的构造函数分配ActionResultValue,而不是两者都分配。

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

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

答案 1 :(得分:1)

如果使用诸如招摇之类的工具,您确实会从服务器上获得确认。

您会遇到这种情况,因为您没有执行http请求,而是简单地调用一个方法(您的控制器方法)并获得了返回类型。您没有创建Web服务器或其他任何东西,因此.net core不会生成http状态代码。

如果要获取状态码,则应使用http请求编写测试。通常,您可以查找邮递员来执行测试。

相关问题