文章目錄
Unit Test 如何驗證 ASP.NET Web Api 的 IHttpActionResult
經過 91 哥三周的 TDD 訓練,我竟自大地以為我會 unit test 了,新專案到手立馬開啟 TDD 開發模式,不要臉地覺得同事寫的 api 可測試性低相當不可取 @@” ,於是乎動手改造了起來,結果就卡住了 哈哈 果然上課跟實作還是存在著極大的落差呀,順手紀錄一下
目標 api 內容
接受一個 url 的 query string 參數
- 沒有傳參數或是參數是空字串就回傳
BadRequest
- 一般正常 string 就回傳
Ok
- 沒有傳參數或是參數是空字串就回傳
範例程式碼
public class DemoController : ApiController { public IHttpActionResult Post([FromUri]string name) { if (string.IsNullOrWhiteSpace(name)) return BadRequest(); else return Ok(); } }
驗證概念說明
因為本例中沒有回傳其他內容,所以只要驗證 api 回傳型別是否合乎預期,需要注意的只是各個 test framework 語法上的不同
MSTest 如何驗證
驗證
BadRequest
[TestMethod()] public void Post_Name_StringEmpty_Return_BadRequest() { var target=new DemoController(); var name = string.Empty; var expected = typeof(BadRequestResult); //act var actualAction = target.Post(name); var actual = actualAction as BadRequestResult; //assert Assert.IsNotNull(actual); Assert.IsInstanceOfType(actual, expected); }
驗證
Ok
[TestMethod()] public void Post_Name_Yowko_Return_Ok() { var target = new DemoController(); var name = "Yowko"; var expected = typeof(OkResult); //act var actualAction = target.Post(name); var actual = actualAction as OkResult; //assert Assert.IsNotNull(actual); Assert.IsInstanceOfType(actual, expected); } ## NUnit 3 如何驗證 1. 驗證 `BadRequest`
cs [Test()] public void Post_Name_StringEmpty_Return_BadRequest() { var target = new DemoController(); var name = string.Empty; var expected = typeof(BadRequestResult); //act var actual = target.Post(name); //assert Assert.IsInstanceOf( expected,actual); }
2. 驗證 `Ok`
cs [Test()] public void Post_Name_Yowko_Return_Ok() { var target = new DemoController(); var name = “Yowko”; var expected = typeof(OkResult); //act var actual = target.Post(name); //assert Assert.IsInstanceOf(expected, actual); }
## xUnit.net 2.0 如何驗證 1. 驗證 `BadRequest`
cs [Fact()] public void Post_Name_StringEmpty_Return_BadRequest() { var target = new DemoController(); var name = string.Empty; var expected = typeof(BadRequestResult); //act var actual = target.Post(name); //assert Assert.IsType(expected, actual); }
2. 驗證 `Ok`
cs [Fact()] public void Post_Name_Yowko_Return_Ok() { var target = new DemoController(); var name = “Yowko”; var expected = typeof(OkResult); //act var actual = target.Post(name); //assert Assert.IsType(expected, actual); } ```
心得
這讓我想起第一次上 TDD 時我也覺得我都會了,工作一忙沒機會用,到現在又上完了一次還是不會用,正如 91 哥說的,學習到內化是沒有捷徑的,只能靠不斷的練習,還好這次專案可以讓我練練功,期望這次可以真的學會
參考資訊
文章作者 Yowko Tsai
上次更新 2021-10-14
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。