2016-05-12 99 views
0

我有一個看起來像這樣的ApiController方法...單元測試ApiController方法和狀態碼不HttpStatusCode枚舉

[HttpPost] 
    public IHttpActionResult Post([FromBody] GloballyEnumeratedMessage gem) 
    { 
     var result = _gemPublisher.PublishGem(gem); 

     if (result.Success) 
     { 
      return Ok(); 
     } 

     return new StatusCodeResult((HttpStatusCode)422, this); 
    } 

我的測試,用於檢查好結果如下。

[TestMethod] 
    public void Post_ValidGem_Returns200() 
    { 
     _gemPublisherMock.Setup(v => v.PublishGem(It.IsAny<GloballyEnumeratedMessage>())).Returns(ResultStatus.FromSuccess()); 

     var controller = new PublishGemController(_gemPublisherMock.Object); 

     // Act 
     IHttpActionResult actionResult = controller.Post(It.IsAny<GloballyEnumeratedMessage>()); 

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

我返回422之前,我是返回一個錯誤請求和測試是這樣的:

[TestMethod] 
    public void Post_InvalidGem_Returns400() 
    { 
     _gemPublisherMock.Setup(v => v.PublishGem(It.IsAny<GloballyEnumeratedMessage>())).Returns(ResultStatus.FromFailure()); 

     var controller = new PublishGemController(_gemPublisherMock.Object); 

     // Act 
     IHttpActionResult actionResult = controller.Post(It.IsAny<GloballyEnumeratedMessage>()); 

     // Assert 
     Assert.IsInstanceOfType(actionResult, typeof(BadRequestResult)); 
    } 

我想保留錯誤請求另一個潛在的故障,從而決定改變郵政法如果發佈失敗,則返回422。我的測試將檢查422狀態碼是什麼樣的?

編輯:解決了基於關閉的問題

[TestMethod] 
public void Post_InvalidGem_Returns422() 
{ 
    _gemPublisherMock.Setup(v => v.PublishGem(It.IsAny<GloballyEnumeratedMessage>())).Returns(ResultStatus.FromFailure()); 

    var controller = new PublishGemController(_gemPublisherMock.Object); 

    // Act 
    IHttpActionResult actionResult = controller.Post(It.IsAny<GloballyEnumeratedMessage>()); 
    var result = (StatusCodeResult) actionResult; 

    // Assert 
    Assert.IsInstanceOfType(actionResult, typeof(StatusCodeResult)); 
    Assert.AreEqual(422, (int)result.StatusCode); 
} 
+1

你不能驗證結果是否是一個'StatusCodeResult'並且它包含狀態422? –

+0

謝謝,我該怎麼做?例如: 'var contentResult = actionResult as StatusCodeResult; Assert.AreEqual(422,(int)contentResult.StatusCode);'? – Robodude

+0

提交這個解決方案,我會標記它解決。 – Robodude

回答

1

以下控制器和測試註釋做什麼,我相信你想要完成的任務:

控制器:

public class MyTestController : ApiController 
{ 
    [HttpPost] 
    public IHttpActionResult Post([FromBody] object gem) 
    { 
     return new StatusCodeResult((HttpStatusCode)422, this); 
    } 
} 

測試:

[TestMethod] 
    public void Post_Returns422() 
    { 
     var controller = new MyTestController(); 

     // Act 
     IHttpActionResult actionResult = controller.Post(It.IsAny<object>()); 

     // Assert 
     Assert.IsInstanceOfType(actionResult, typeof(StatusCodeResult)); 
     Assert.AreEqual((int)((StatusCodeResult)actionResult).StatusCode,422); 
    } 
+0

我認爲你在正確的軌道上,但actionResult沒有那個屬性。 – Robodude

+1

感謝您的反饋,我已經相應地更新了我的答案。 – MSC