Сброс последовательности Angular HTTP TestRequest - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть функция async, которая должна сделать запрос POST, но сначала необходимо извлечь некоторые данные с сервера:

async createObject() {
  // HTTP request #1: dep1 is needed for the second request
  const dep1 = await this.http.get("/urlA")
    .pipe(first())
    .toPromise();
  // Create the request object out of dep1 and some additional values
  const req = mkCreateParams(this.name, dep1);
  // HTTP request #2: Build something
  const res = await this.http.post("/urlB")
    .pipe(first())
    .toPromise();
  // When everything is done: Navigate away
  this.router.navigateByUrl(`/urlC/${res.id}`);

  return res;
}

Я использую следующий код для проверки этого :

const httpTesting = TestBed.inject(HttpTestingController);
const req = testInstance.createObject();

httpTesting
  .expectOne("/urlA")
  .flush({ /* ... SNIP ... */);

const generatedId = "f9f64792-0ceb-4e3c-ae7b-4c7a8af6a552";
httpTesting
  .expectOne({ method: "POST", url: "/urlB" })
  .flush({ id: generatedId });

const res = await req;
expect(res.id).toEqual(generatedId);

Сбой сразу же при ожидании /urlB и даже не достигает линии, где разрешается res. Сообщение об ошибке выглядит следующим образом:

Expected one matching request for criteria "Match method: POST, URL: /urlB", found none.

Возможно, это связано с тем, что при вызове HttpTestingController.expectOne() должен был уже быть выполнен запрос. Поскольку обещания решаются с нетерпением в JavaScript, первый запрос уже сделан, а второй нет.

Есть ли способ сказать Angular HttpTestingController немного расслабиться и подождать, пока просьба прийти через некоторое время? На это намекает существование HttpTestingController.verify, но я понятия не имею, как попасть в состояние, в котором это было бы полезно.

1 Ответ

1 голос
/ 03 апреля 2020

Я думаю, что ожидание обещаний может помочь вам, попробуйте fixture.whenStable().

it('your title here', async done => {
  const httpTesting = TestBed.inject(HttpTestingController);
  const req = testInstance.createObject();

  httpTesting
    .expectOne("/urlA")
    .flush({ /* ... SNIP ... */);
  await fixture.whenStable(); // wait for the pending promises to resolve before proceeding
  const generatedId = "f9f64792-0ceb-4e3c-ae7b-4c7a8af6a552";
  httpTesting
    .expectOne({ method: "POST", url: "/urlB" })
    .flush({ id: generatedId });
  await fixture.whenStable(); // wait for the pending promises to resolve before proceeding
  const res = await req;
  expect(res.id).toEqual(generatedId);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...