2016-03-27 111 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