我正在遵循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()
才能获得它?与句子
隐式强制转换运算符支持将
T
和ActionResult
都转换为ActionResult<T>
。T
转换为ObjectResult
,这意味着return new ObjectResult(T);
简化为return T;
。
在文档中我认为没有必要...?
答案 0 :(得分:1)
包装 [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,它的构造函数分配ActionResult
或Value
,而不是两者都分配。
如果未明确设置状态代码,则MVC管道将为响应分配成功状态代码。但是我找不到有关该声明的文档。
这意味着在此测试中获得的响应在任何地方都不会有状态码或Result
。您可以 将其转换为OkActionResult
,但是没有状态码。
答案 1 :(得分:1)
如果使用诸如招摇之类的工具,您确实会从服务器上获得确认。
您会遇到这种情况,因为您没有执行http请求,而是简单地调用一个方法(您的控制器方法)并获得了返回类型。您没有创建Web服务器或其他任何东西,因此.net core不会生成http状态代码。
如果要获取状态码,则应使用http请求编写测试。通常,您可以查找邮递员来执行测试。