Наблюдаемый <void>не вызывает абонента - PullRequest
0 голосов
/ 26 апреля 2020

Я изо всех сил пытаюсь получить модульный тест вокруг Обсерватории, чтобы вести себя так, как я ожидаю. Я использую Observable, по сути, просто чтобы сообщить, что процесс завершен. В функции выхода из системы еще нет асин c кода, но будет, когда я реализую все логи c. Мне не нужно, чтобы наблюдаемое возвращало какие-либо данные, я просто хочу, чтобы оно вызывало подписчика в качестве сигнала о завершении выхода из системы.

Проблема в том, что мои модульные тесты показали, что подписчик никогда не вызывается. Обычно я работаю с async / await, по иронии судьбы, потому что Observables, как правило, причиняют мне головную боль, выполняя подобные вещи, но я пытаюсь стать лучше на переднем крае, который, похоже, предпочитает Observables.

Это новое приложение Angular 9, которое я строю. Модульные тесты выполняются в Jest, и я запускаю их через Wallaby.

Вот мое устранение неисправностей:

Я намеренно сломал функцию, чтобы проверить мои работы модульного теста.

Test doesn't invoke assertion

Серая рамка в строке 63 моих тестов - это Уоллаби, указывающая, что тест никогда не выполнял эту строку. Поэтому, естественно, тест пройден, потому что утверждение никогда не проверялось.

Если я изменяю наблюдаемое, чтобы вернуть значение, я по крайней мере получаю строку для выполнения ... вроде.

Assertion invoked, but incorrect error.

Но я не получаю сообщение об ожидаемом сбое из моего макета. Он должен сообщить, что «ожидаемый вызов clearSession () будет вызван 1 раз, был 0»

Поэтому я запускаю Jest, просто чтобы посмотреть, что происходит, и получаю:

FAIL  src/app/auth/auth.service.spec.ts
● AuthService › logout › should destroy the session

1 timer(s) still in the queue.

  at node_modules/zone.js/dist/fake-async-test.js:621:31
  at ZoneDelegate.Object.<anonymous>.ZoneDelegate.invoke (node_modules/zone.js/dist/zone.js:386:30)
  at ProxyZoneSpec.Object.<anonymous>.ProxyZoneSpec.onInvoke (node_modules/zone.js/dist/proxy.js:117:43)
  at ZoneDelegate.Object.<anonymous>.ZoneDelegate.invoke (node_modules/zone.js/dist/zone.js:385:36)
  at Zone.Object.<anonymous>.Zone.run (node_modules/zone.js/dist/zone.js:143:47)

Чтобы все было по-настоящему странно ... если я исправлю функцию, все будет в порядке! Но только до тех пор, пока Observable возвращает значение, хотя я использую Observable только для уведомления о завершении процесса. Но я не смог заставить мое действительное утверждение потерпеть неудачу, оно провалилось из-за чего-то, казалось бы, не связанного (Таймер в очереди? Что бы это ни значило).

Test passes with assertion executed

Функция verify взята из ts-mockito и работает, в основном, как функция expect(someSpy).toHaveBeenCalledTimes().

Есть ли какая-то причуда в наблюдаемых, которые я пропускаю?

1 Ответ

0 голосов
/ 26 апреля 2020

Я отправил этот вопрос в Reddit прошлой ночью. Только что получил ответ, который решил эту проблему, поэтому публикуйте здесь для тех, кто пытается решить то же самое.

Измените of() на of(undefined)

enter image description here

...