C# 断言200 Http响应中的空内容

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(); //

我有一个简单的WebAPI方法,它返回一个列表。作为一般项目规则,我决定,如果特定用户ID的列表为空,则返回一个内容为空的Ok()方法。 我的web api方法如下所示:

[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);


    }