catspeake
2021-04-27 09:56:48
我正在尋找使用HttpTestingController來測試我的服務通過HttpClient發送的POST請求中是否包含正確的字段集。網絡表格export class WebFormService {constructor(private httpClient: HttpClient) { }public submitForm(fields): Observable<any> { const headers = new HttpHeaders() .set('Content-Type', 'application/x-www-form-urlencoded'); const body = new HttpParams() .set('_to', environment.FORM_RECIPIENT) .set('source', 'mysite'); for (let key of fields) { body.set(key, fields[key]); } return this.httpClient.post( environment.FORM_URL, body, {headers} );}web-form.spec.tsit('sends a POST request via the HttpClient service', () => { const testFields = { name: 'test contributor', message: 'my message', email: '[email protected]' }; webFormService.submitForm(testFields).subscribe(); const req = httpTestingController.expectOne(environment.FORM_URL); expect(req.request.method).toEqual('POST'); expect(req.request.headers.get('Content-Type')).toEqual('application/x-www-form-urlencoded'); // Here I'd like to make assertions about the fields that data being posted. req.flush('');});HttpRequest是url編碼的body,所以req.request.body是正確的url編碼的字符串。有什么好的選擇可以進行測試而無需對請求主體進行解碼和比較對象?
1 回答

慕容森
TA貢獻1853條經驗 獲得超18個贊
實際上,該HttpParams對象仍然可以通過HttpRequestbody屬性使用。
這有點令人困惑且難以發現,因為HttpParams.toString()函數執行urlencoding,這反過來又導致測試運行程序發出已編碼的字符串。
因此,仍然可以利用HttpParams函數來獲取被測服務提供給的鍵和值HttpClient。
例如...
const req = httpTestingController.expectOne(environment.CONTRIBUTION_FORM_ENDPOINT);
expect(req.request.method).toEqual('POST');
expect(req.request.headers.get('Content-Type')).toEqual('application/x-www-form-urlencoded');
const expectedFormKeys = Object.keys(testFields).concat(['_to', 'source']);
expect(req.request.body.keys().sort()).toEqual(expectedFormKeys.sort());
// ... and so on
添加回答
舉報
0/150
提交
取消