Последовательность тестирования вызовов REST API — «не было текущей спецификации»

#angular #rest #testing #observable

#angular #rest #тестирование #наблюдаемый

Вопрос:

Я пытаюсь протестировать последовательность создания / удаления для REST-сервиса as. Приведенный ниже пример всегда выполняется в IDE, но выдает ошибку в отладчике Karma / Jasmine.

 "expect' was used when there was no current spec, 
this could be because an asynchronous test timed out"
  

Каждый тест в отдельности выполняется нормально.


 it("should return the number of deleted items after creation", done => {
  const ex1 = sgformsService.getOrCreate("Endoskopie", 9999, "2019-03-20");
  const ex2 = sgformsService.deleteByParameter(
    "Endoskopie",
    9999,
    "2019-03-20"
  );
  const ex = ex2.pipe(concat(ex1)).subscribe((val: number) => {
    expect(val).toEqual(7);
    done();
  });
});

  

Комментарии:

1. Сможете ли вы создать минимальный рабочий пример? Так что, можно немного поиграть с тестом и решить проблему? Сообщение об ошибке может свидетельствовать о том, что тест завершен до того, как было вызвано фактическое ожидание в рамках подписки.

2. Другая проблема может заключаться в том, что concat сначала выдает значения первого наблюдаемого, а затем из объединенного наблюдаемого. Это означает, что ожидаемый бит (val) запускается дважды в текущей настройке. Не слишком уверен, предназначено ли это. Чтобы помочь в дальнейшем, было бы необходимо знать, что возвращает getOrCreate и deleteByParam. Есть ли задержка или что-то подобное?

3. Спасибо, что изучили это, @Erbsenkoenig. Смотрите ниже. Мне нужно было еще немного отладки, чтобы понять, как возвращаются значения.

Ответ №1:

Я не до конца понимал, как возвращаются значения, и ожидал, что будет возвращено только последнее. Вот рабочее решение:

  it('should return the number of deleted items after creation', done => {
      const ex1 = sgformsService.getOrCreate('Endoskopie', 9999, '2019-03-20')
      const ex2 = sgformsService.deleteByParameter('Endoskopie', 9999, '2019-03-20')
      const ex= ex1.pipe(concat(ex2))
        .subscribe((val: number|SgformsBase[]) => {
          if (typeof(val) === "number") {
            expect(val).toEqual(7)
            done()
          }
      });
  })

  

Комментарии:

1. но если вас интересует только значение, выдаваемое параметром deleteByarameter, вы могли бы использовать оператор flatMap, тогда вам не нужно было бы проверять тип, и вы не запускали бы метод дважды.