【问题标题】:Unit Testing IHttpActionResult Controller - Testing for 200 OK fails单元测试 IHttpActionResult 控制器 - 测试 200 OK 失败
【发布时间】:2016-07-14 15:58:44
【问题描述】:

这可能是一个相当简单的问题,但我承认,我被卡住了。

我有一个返回 IHttpActionResult 的控制器,我需要为此编写单元测试。

这是控制器:

public IHttpActionResult GetPerson(int id) {

    Person person = repository.Get(id);

    if (person == null) {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }

    return Ok(new {
        User = person
    });

}

这是单元测试:

[TestMethod]
public void GetReturnsValidPerson() {

    var userController = new UserController();

    IHttpActionResult actionResult = userController.GetPerson(1);

    Assert.IsInstanceOfType(actionResult, typeof(OkResult));

}

这是测试的错误:

Assert.IsInstanceOfType 失败。预期的 类型:System.Web.Http.Results.OkResult 实际类型: System.Web.Http.Results.OkNegotiatedContentResult1[f__AnonymousType11[DataAccess.BO.Person]]

这里到底发生了什么?控制器的返回是一个 HTTP 200 Ok 响应。为什么这期待OkNegotiatedContentResult

【问题讨论】:

    标签: c# unit-testing


    【解决方案1】:

    根据 Asp.Net 文档,IHttpActionResult 的结果是OkNegotiatedContentResult。您的断言比较应该检查这一点。

    Unit Testing Controllers in Asp.Net

    操作返回 200 (OK) 和响应正文

    如果找到产品,Get 方法会调用 Ok(product)。在单位 测试,确保返回类型是 OkNegotiatedContentResult 并且 退回的产品具有正确的 ID。

    【讨论】:

    • 在我问之前我确实检查了文档和很多博客,因为它看起来相当简单。这不应该工作吗? Assert.IsInstanceOfType(actionResult, typeof(OkNegotiatedContentResult<OkResult>));?由于类型不匹配,我仍然失败。
    • 你把IHttpActionResult actionResult = userController.GetPerson(1);这一行的返回类型设置为OkNegotiatedContentResult了吗?虽然这种类型的测试是多余的。最好测试 null 返回和返回的对象
    • 我做了,我必须投射它,但投射失败。 System.InvalidCastException: Unable to cast object of type 'System.Web.Http.Results.OkNegotiatedContentResult1[f__AnonymousType11[DataAccess.BO.Person]]' to type 'System.Web.Http.Results.OkNegotiatedContentResult1[System.Web.Http.Results.OkResult]'.`我把这行改成了var actionResult = (OkNegotiatedContentResult<OkResult>)userController.GetPerson(1);。我想我将只测试对象的实际结果,而不是 HTTP 状态代码。对不起,如果这很愚蠢,我是新来的这种 Web API 测试。
    • 我知道这里有什么问题。由于必须在返回的 JSON 中包含一个根节点,我现在返回一个导致转换问题的匿名类型。例如,控制器的返回现在是 return Json(new { User = person });,只是为了给 JSON 一个根名称 User。我不知道如何将其转换为需要类型的OkNegotiatedContentResult<>
    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    相关资源
    最近更新 更多