#javascript #angular #testing
#javascript #угловой #тестирование
Вопрос:
Я хочу использовать HttpTestingController для проверки того, что правильный набор полей включен в POST-запрос, который моя служба отправляет через HttpClient.
web-form.ts
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.ts
it('sends a POST request via the HttpClient service', () => {
const testFields = {
name: 'test contributor',
message: 'my message',
email: 'test@tester.com'
};
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 body
кодирует URL-адрес, поэтому строка, правильно закодированная в url req.request.body
.
Есть ли хороший вариант для тестирования, не прибегая к декодированию тела запроса и сравнению объектов?
Ответ №1:
На самом деле, HttpParams
объект по-прежнему доступен через свойство HttpRequest body
.
Это было немного запутанно и трудно определить, потому 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