系列目錄html
Web項目中,不少與用戶數據交互的請求都是Post請求,想必你們都用過HttpClient構造過post請求,這裏並不對HttpClient作詳細介紹,只介紹一些經常使用的功能.並結合AutoFixture演示如何自動構造請求數據,簡單手動建立Json或者Formdata的工做量,提升生產效率.web
咱們爲上節建立的HelloWorld控制器添加一個StudentInfo
方法,內容以下json
[HttpPost] public IActionResult StudentInfo(Student student) { return Content(student.Name); }
這個方法的參數是一個Student類型的對象,和早期版本mvc並無太大差異,咱們把這個Student類的代碼貼出來:後端
public class Student { public string Name { get; set; } public int Age { get; set; } public byte Gender { get; set; } public string School { get; set; } }
下面咱們來構造一個對StudentInfo的請求測試方法.api
如何建立測試內存服務器的方法在第8節裏有講到,這裏再也不講,如下用到的都是測試服務器建立的
HttpClient
對象.瀏覽器
[Fact] public async Task SimplePost() { Dictionary<string, string> dict = new Dictionary<string, string> { {"name","sto"}, {"age","32" }, {"gender","2" }, {"school","middleschool" } }; var response = await _client.PostAsync("/HelloWorld/StudentInfo", new FormUrlEncodedContent(dict)); response.EnsureSuccessStatusCode(); var result =await response.Content.ReadAsStringAsync(); Assert.Equal("sto", result); }
以上代碼可能你們都很是熟悉了.咱們用dictionary對象構造了formdata而後作爲post請求內容發送到服務端,服務端返回的是接收到的student對象的name屬性,這裏咱們驗證服務端返回的name是否是咱們傳過去的"sto".服務器
然而這樣作是很是耗時的,若是隻寫一兩個測試方法還好,對成千上百個方法這樣構建參數是很是繁瑣和乏味的,而且若是後端對數據有限制的狀況下想構造出來符合條件的數據更是麻煩,而且後端接口若是字段有修改則有可能形成測試失敗.因爲測試項目引用了mvc項目,所以咱們能夠訪問到mvc項目裏的這些類型,而後使用AutoFixture動態建立這些類型的實例,而後序列化爲Json提交,這樣會明顯減小工做量並增長程序的可維護性.mvc
AutoFixture的安裝前面也提到過,而且它是支持.net core的,咱們在Nuget包管理工具界面輸入AutoFixture.Xunit2
進行搜索,而後下載這個包便可,若是直接下載它則不用下載AutoFixture包,由於它是這個包的一個依賴,會自動安裝.app
改造後的方法以下:asp.net
[Theory] [AutoData] public async Task SimplePost(Student stud) { var content = new StringContent(JsonConvert.SerializeObject(stud), Encoding.UTF8, "application/json"); var response = await _client.PostAsync("/HelloWorld/StudentInfo", content); response.EnsureSuccessStatusCode(); var result =await response.Content.ReadAsStringAsync(); Assert.True(!string.IsNullOrEmpty(result)); }
首先fact註解變成了Theory註解,咱們知道要爲測試方法添加參數須要使用Theory註解,下面添加了AutoData註解,添加之後AutoFixture就會自動爲方法的參數提供值.
下面咱們把stud對象序列化爲json字符串,而後包裝成一個stringcontent對象提交到後臺,因爲傳入的是什麼值是AutoFixture隨機建立的,咱們並不知道,所以不能像上面同樣斷言它是"sto",可是它必定是有值的,所以咱們斷言它不是null或者空字符串.
然而遺憾的是,以上測試卻沒有經過,咱們看一下錯誤面板信息:
經過面板信息咱們看到AutoFixture構建的對象Name裏是有值的,然而卻返回的False,咱們只知道結果,其中的過程咱們並不清楚,也很難直觀的看到錯誤緣由,這時候咱們使用調試模式來啓動測試程序
首先咱們在測試方法剛進入的時候打上斷點,看看傳入的有沒有值
進入mvc項目,在方法剛進入的地方也打上斷點
下面咱們對測試方法執行調試
測試方法如何調試在前面的章節中已經講過,咱們在Test Explorer面板裏找到這個方法而後右鍵點擊它的名字,在右鍵菜單裏選擇"調試單元測試",更爲簡單的方法是,若是一個測試方法執行失敗,則在它的方法定義上會出現一個紅叉
咱們點擊這個紅叉就會出現一個浮動面板
下面有兩個按鈕一個是運行一個是調試,點擊調試就能夠進入調試模式了.
第一個斷點處咱們看到stud的每個字段都是有值的
按下F5繼續,進入mvc方法裏的斷點
咱們看到這裏每一個字段綁定的都是默認值,也就是咱們傳入的值並無綁定成功.
以上的調試是爲了展現如何調試mvc測試項目,以上單步調試並不能幫助咱們太多,實際上是由於.net core mvc改變了以往的綁定方式,改爲了webapi 2.0的綁定方式,也就是要顯式的給參數加上FromBody註解方可成功綁定json數據
前面的示例咱們看到formData是不須要註解就能夠成功綁定的
咱們改一下Mvc裏的方法,增長一個frombody
註解
[HttpPost] public IActionResult StudentInfo([FromBody]Student student) { return Content(student.Name); }
咱們再次運行,就可以正確綁定值了.
注意,不少人會想,是否是加了frombody註解之後即可以接收formdata類型的參數,又能接收json類型參數呢,其實答案是否認的,若是加上了frombody後再提供formdata類型參數,則會返回415不支持的格式錯誤.所以這裏要權衡,若是是傳統的mvc項目經過form提交,則不能添加frombody,固然有一些插件能夠把form序列化爲json,這樣就能夠了.
有引發朋友可能會有疑惑,我直接從瀏覽器發送請求或者使用postman工具就好了,幹嗎這麼費勁呢?這樣作的意義何在呢?其實前面也說到過,使用postman或者其它工具請求一方面不利於自動化測試(固然,postman是能夠作到的)另外一方面這樣作依賴於外部web服務器,若是有多個環境在發佈更新的時候遺漏了某一個環境就會形成測試結果的不穩定,而且測試環境遷移了,測試項目也要跟着遷移,增長了維護成本.使用asp.net core自身的內存web服務器功能則徹底不依賴於外部web服務器或者外部測試工具,測試時自動啓動web服務器,測試完成本身銷燬,極大地方便了持續測試.