這周開始接觸到了十分正式的項目開發,感受本身距離能實戰真的差太多了,有一些小問題可能要半天或者更久才能解決,單元測試仍是硬傷,效率低的不行,早起九點開始寫代碼,晚上十一點多結束,甚至有一次肝到一點多,可是解決的問題很少,感受本身有程序員加班的潛質,尚未寫好代碼的水平,跟代碼交流挺有意思的,只是如今能力有限,有些問題還不能有效地解決,這一週的問題還真很多,總結性的整理了一下。git
以前對單元測試的理解是路由對上了就能過,即請求的url與預測的url對應上就能夠了,卻不知並不是全部的預測url與請求url一致就能夠,好比GET方法,下面是一個GET方法的請求:程序員
public getUserByUsername(username: string): Observable<boolean> { return this.httpClient.get<boolean>(`${this.baseUrl}/getUserByUsername`, {params: {username}}); }
下面是測試:github
it('getUserByUsername', () => { const username = Random.nextString ('', 11); let result; /* 進行訂閱,發送數據後將called置true */ let called = false; service.getUserByUsername(username).subscribe ((data) => { called = true; result = data; }); const request = httpController.expectOne ( `${baseUrl}/getUserByUsername`); expect (request.request.method).toEqual ('GET'); req.flush(of(undefined)); expect (called).toBe (true); });
而後運行測試:
當時不是很理解爲什麼報錯,後來問了一下潘老師,而後老師說教程上有:5 測試HTTP請求【前】,就看到了這:spring
const req = httpTestingController.expectOne('http://localhost:8080/Klass?name=');
我覺得加上參數就行了,而後就改爲了這樣:segmentfault
const request = httpController.expectOne ( `${baseUrl}/getUserByUsername?username=`);
結果可想而知,仍是ERROR,而後啓動項目,打開控制檯看了一下實際請求的:
注:該方法並不是項目原有的方法,只是爲了演示,因此請求時會發生錯誤。
實際請求的url帶有參數名和參數,而後就改爲了這樣:springboot
it('getUserByUsername', () => { const username = Random.nextString('', 11); let result; /* 進行訂閱,發送數據後將called置true */ let called = false; service.getUserByUsername(username).subscribe ((data) => { called = true; result = data; }); const request = httpController.expectOne( `${baseUrl}/getUserByUsername?usename=${username}`); expect(request.request.method).toEqual('GET'); req.flush(of(undefined)); expect(called).toBe(true); });
再次測試經過。
dom
在解決問題的時候看到StackOverflow解決一樣問題的博客下面有人這樣說,而後就懵了,畢竟教程用的expectOne()測試的帶有參數的url,通過本身實踐才發現實踐出真知,聽到的看到的都不必定是正確的。
ide
測試請求時,若是沒有把握就實際調用一下,看一下實際請求的url,預測的url要和實際請求的url徹底一致。單元測試
以前常常用到的HTTP請求有GET,POST,PUT,DELETE等,
最近接觸到了PATCH,對於PATCH也只是在教程裏據說過,第一次用也不知道咋用,而後就查了一下:測試
PATCH是對 PUT 方法的補充,用來對已知資源進行局部更新 。
當時對patch請求不是很熟悉,而後就開始了「創做」:
老師已經給了後臺,前臺怎麼傳不是很熟悉,一開始想着直接傳:
updatePasswordOfCurrentLoginUser(password: Password): Observable<void> { return this.http.patch<void>(`${this.baseUrl}/updatePasswordOfCurrentLoginUser`, password); }
卻不知後臺只接收JSON對象,而後就改爲了:
updatePasswordOfCurrentLoginUser(password: Password): Observable<void> { return this.http.patch<void>(`${this.baseUrl}/updatePasswordOfCurrentLoginUser`, {params:rePassword}); }
可是@RequestBody卻不收:
而後只能傳一個User對象過去,把後臺須要的值給User相應的屬性就行了。
本覺得照着別人的寫能成功,但發現本身想的太天真,並無對應上。
後來在教程裏發現了請求對應的先後臺寫法:
綁定到用戶輸入事件【前】
以前寫代碼都是Ctrl + C , Ctrl + V ,沒有切實地去體會代碼的意思,在出錯誤以前一直覺得本身的想法是對的,而後就一直照着本身的想法來,出錯了就懵了,各類想不通,好在此次把問題暴露出來了,改正了本身的一些想法,也補齊了一些知識性上的缺陷,固然也知道了遇到不會的先去教程找找,不然再趕上一樣的問題,又要很久才能解決。
最後,感謝潘老師和學長們以及小夥伴們給予的指導和幫助。
本文做者:河北工業大學夢雲智開發團隊 張文達