#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, тогда вам не нужно было бы проверять тип, и вы не запускали бы метод дважды.