之前已经使用HttpClientTestingModule取代HttpClient,HttpTestingController取代
HttpClient,这只能确保呼叫 API 时不用透过网络。
还要透过expectOne()设定要 mock 的 URI 与 action,之所以取名为?expectOne(),就是
期望有人真的呼叫这个 URI一次,且必须为GET,若没有呼叫这个 URI 或者不是GET,将造成单元
测试红灯。
这也是为什么HttpTestingController的设计是act与assert要先写,最后再写?arrange,因为
HttpTestingController本身也有assert功能,必须有act,才能知道assert?URI 与 GET 有没有错误。
最后使用flush()设定 mock 的回传值,flush英文就是冲水,当HttpTestingController将
mockResponse冲出去后,才会执行subscribe()内的expect()测试。
也就是说若你忘了写flush(),其实单元测试也会?绿灯,但此时的绿灯并不是真的测试通过,
而是根本没有执行到subscribe()内的expect()。
81 行
afterEach(() => {
mockHttpClient.verify();
});
复制代码
实务上可能真的忘了写expectOne()与flush(),导致subscribe()内的expect()根本没跑到而
造成单元测试绿灯,因此必须在每个单元测试跑完补上?mockHttpClient.verify(),若有任何 API
request 却没有经过expectOne()?与?flush()?测试,则?verify()?会造成单元测试红灯,借以弥补
忘了写?expectOne()?与?flush()?的人为错误。
Q : 我们在?listPosts$()?的单元测试到底测试了什么 ?
若 service 的 API 与 mock 不同,会出现单元测试红灯,可能是 service 的 API 错误
若 service 的 action 与 mock 不同,会出现单元测试红灯,可能是 service 的 action 错误
若 service 的 response 与 expected 不同,可能是 service 的逻辑错误
61 行
因为要 mock?POST,因此method?部分改为POST,其他部分与?GET?部分完全相同。
Q : 我们在?addPost()?到底测试了什么 ?
●若 service 的 API 与 mock 不同,会出现单元测试红灯,可能是 service 的 API 错误
●若 service 的 action 与 mock 不同,会出现单元测试红灯,可能是 service 的 action 错误
●若 service 的 response 与 expected 不同,可能是 service 的逻辑错误
使用 Wallaby.js 通过所有 service 单元测试。