C# 断言200 Http响应中的空内容
我有一个简单的WebAPI方法,它返回一个列表。作为一般项目规则,我决定,如果特定用户ID的列表为空,则返回一个内容为空的Ok()方法。 我的web api方法如下所示:C# 断言200 Http响应中的空内容,c#,unit-testing,asp.net-web-api,moq,C#,Unit Testing,Asp.net Web Api,Moq,我有一个简单的WebAPI方法,它返回一个列表。作为一般项目规则,我决定,如果特定用户ID的列表为空,则返回一个内容为空的Ok()方法。 我的web api方法如下所示: [Route("")] [HttpGet] public IHttpActionResult GetPersonalList() { var result = _facade.Get(_userContext.Get()); if (result == null) return Ok(); //
[Route("")]
[HttpGet]
public IHttpActionResult GetPersonalList()
{
var result = _facade.Get(_userContext.Get());
if (result == null)
return Ok(); //here is the point
return Ok(new PersonalExpensesReportViewModel(result));
}
为了使这个方法的覆盖率达到100%,我想测试我提到的场景,但是我无法实现如何为空内容编写断言
[TestMethod]
public void GetPersonalList_NoContent_Ok()
{
//Arrange
_facade.Setup(x => x.Get(_userContext.Object.GetPersonnelNumber(), null)).Returns((PersonalExpensesReport)null);
//Act
var result = _controller.GetPersonalList();
//Assert
var negociatedResult = result as OkResult;
Assert.IsNotNull(result);
// ?? I want something like Assert.IsNull(negociatedResult.Content)
}
由于我没有将某个类型生成为OkNegotiatedContentResult的结果,该类型需要实例化t类型,因此我考虑将强制转换为OkResult,但我在这个类中没有“Content”属性
有人知道在这种情况下如何处理吗?请尝试使用类似于:
var result=\u controller.GetPersonalList();
var响应=结果为OkNegotiatedContentResult;
Assert.IsNotNull(响应);
var content=response.content;
arest.AreEqual(5,content.Count());
[TestMethod]
public void GetPersonalList\u NoContent\u Ok()
{
var servicesponse=新的yourresponseobject{
Message=“what ever response”;
数据=空;
};
var service=newmock(MockBehavior.Strict);
service.Setup(x=>x.GetPersonalList()(It.IsAny()).ReturnsAsync(serviceResponse);///对于控制器方法中的参数数量,请添加它。IsAny()
//安排
_Setup(x=>x.Get(_userContext.Object.GetPersonnelNumber(),null)).Returns((PersonalExpensesReport)null);
//表演
var result=_controller.GetPersonalList();
//断言
var negociatedResult=作为对象的结果;
Assert.IsNotNull(result.value);
Assert.AreEqual(200,result.NegatedResult.statuscode);
}
为什么不想对空列表使用204“无内容”
?因为UI开发人员这样定义它:(我知道这个解决方案,在这种情况下,单元测试会使问题变得更简单,但我无法应用它。好的,你是否尝试过OKNegatedContentResult
?这并不能解决问题,因为正如我所说,我的Web Api返回的是一个空值,而不是PersonalExpensesReportViewModel,所以在这种情况下,我得到的响应是“null”值,因为编译器无法强制转换到此类。我的意思是,我无法获取OKNEGOCATEDCONTENTRESULT的实例。更清楚地说,如果我的内容为空,将PersonalExpensesReportViewModel用作OKNEGOCATEDCONTENTRESULT是不正确的,你知道我的意思吗?这甚至不会编译。
var result = _controller.GetPersonalList();
var response = result as OkNegotiatedContentResult<PersonalExpensesReportViewModel>;
Assert.IsNotNull(response);
var content = response.Content;
Assert.AreEqual(5, content.Count());
[TestMethod]
public void GetPersonalList_NoContent_Ok()
{
var serviceresponse = new yourresponseobject<yourmodel>{
Message = "what ever response";
Data = null;
};
var service = new Mock<youserviceInterface>(MockBehavior.Strict);
service.Setup(x => x.GetPersonalList()(It.IsAny<string>())).ReturnsAsync(serviceResponse); /// for number of parameters in controller method, add It.IsAny<string>()
//Arrange
_facade.Setup(x => x.Get(_userContext.Object.GetPersonnelNumber(), null)).Returns((PersonalExpensesReport)null);
//Act
var result = _controller.GetPersonalList();
//Assert
var negociatedResult = result as Object;
Assert.IsNotNull(result.value);
Assert.AreEqual(200,result.negociatedResult.statuscode);
}