【问题标题】:Assert for empty content in 200 Http Response断言 200 Http 响应中的空内容
【发布时间】:2015-11-06 17:36:10
【问题描述】:

我有一个简单的 Web Api 方法,它返回一个列表。我决定作为一般项目规则,如果特定 userId 的列表为空,我们返回一个内容为空的 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)
}

由于我没有特定的类型来使 result as OkNegotiatedContentResult 期望 T 类型被实例化,所以我考虑强制转换为 OkResult,但 我没有此类中的“内容”属性

有人知道在这种情况下如何处理吗?

【问题讨论】:

  • 为什么你不想使用204 No Content作为空列表?
  • 因为 UI 开发人员是这样定义的 :( 我知道那个解决方案,在这种情况下,单元测试变得更简单,但我无法应用它。
  • 好的,你试过OkNegotiatedContentResult吗?

标签: c# unit-testing asp.net-web-api moq


【解决方案1】:

请尝试使用OkNegotiatedContentResult<T>like:

var result = _controller.GetPersonalList();
var response = result as OkNegotiatedContentResult<PersonalExpensesReportViewModel>;   
Assert.IsNotNull(response);
var content = response.Content;
Assert.AreEqual(5, content.Count());

【讨论】:

  • 这不能解决问题,因为正如我所说,我的 Web Api 返回一个空值而不是 PersonalExpensesReportViewModel,所以在这种情况下,我得到的响应是“null”值,因为编译器无法转换为此类。我的意思是,我无法获取 OkNegocitatedContentResult 的实例。
  • 说清楚一点,如果我的内容是空的,使用 PersonalExpensesReportViewModel 作为 OkNegociatedContentResult 的 T 是不正确的,你知道我的意思吗?
【解决方案2】:
    [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);


    }

【讨论】:

  • 这甚至无法编译。
猜你喜欢
  • 2012-02-03
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
相关资源
最近更新 更多