2016-03-27 110 views
1

这可能是一个相当简单的问题,但我承认,我卡住了。单元测试IHttpActionResult控制器 - 测试200 OK失败

我有一个控制器返回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

回答

2

根据Asp.Net文档,IHttpActionResult的结果是OkNegotiatedContentResult。你的Assert比较应该检查。

Unit Testing Controllers in Asp.Net

行动返回200(OK)与若发现产品有一个响应体

GET方法调用好(产品)。在单元 测试中,确保返回类型为OkNegotiatedContentResult,并且 返回的产品具有正确的ID。

+0

我在查询之前检查过文档和很多博客,因为它看起来很简单。如果这不起作用呢? 'Assert.IsInstanceOfType(actionResult,typeof(OkNegotiatedContentResult ));'?由于类型不匹配,我仍然失败。 – Patrick

+0

您是否已将此行的返回类型IHttpActionResult actionResult = userController.GetPerson(1);设置为'OkNegotiatedContentResult'?尽管这种类型的测试是多余的。最好测试一下空返回和那个返回的对象 –

+0

我做了,我必须投它并且投射失败。 'System.InvalidCastException:无法强制类型为'System.Web.Http.Results.OkNegotiatedContentResult'1 [<> f__AnonymousType1'1 [DataAccess.BO.Person]]的对象类型'System.Web.Http.Results.OkNegotiatedContentResult '1 [System.Web.Http.Results.OkResult]'。'我将行更改为'var actionResult =(OkNegotiatedContentResult )userController.GetPerson(1);'。我想我只是测试对象的实际结果,而不是HTTP状态代码。对不起,如果这是愚蠢的,我是新来的这种测试与Web API。 – Patrick