HttpTestingController проверяет правильность полей x-www-form-urlencoded через HttpParams

#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