Насмешливый, Наблюдаемый с Шутом - rxjs - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть простой трубопровод Observable из другого Observable, который я хочу протестировать.

const loginState$ = messageBusObservables.loginState$.pipe(
    startWith({ isLoggedIn: false })
    pluck('isLoggedIn'),
    distinctUntilChanged()
  )

messageBusObservables - это объект наблюдаемых.Где loginState $ - Observable.

В моих тестах я думал, что легко смогу смоделировать модуль './messageBus' следующим образом: (как импортируется модуль, не имеет значения, но импорт предпочтителен)

import { of } from 'rxjs'
import './messageBus'
jest.mock('./messageBus', () => ({
  loginState$: of({ isLoggedIn: true }),
}))

Однако Jest выдает ошибку:

babel-plugin-jest-hoist: фабрике модулей jest.mock() не разрешено ссылаться на какие-либо вне области видимости.переменные.Недопустимый доступ к переменной: из

Я попытался, поместив его в jest.fn() Я попытался извлечь of({ isLoggedIn: true }) в переменную.Но я продолжаю получать ту же ошибку от jest.

Так как я могу смоделировать ввод в мои Observables, используя Jest?Я столкнусь с той же проблемой с другими наблюдаемыми, используя .merge, .zip и т. Д.

Это должна быть реальная наблюдаемая, которая является входом моих других наблюдаемых.Я просто хочу смоделировать значение с чем-то вроде of(), а не над объектом, с методом на нем, который возвращает объект с помощью метода .pipe и т. Д. (Я не хочу высмеивать функциональность Observable),Я хочу передать его реально наблюдаемым со значением, установленным в моем модульном тесте.

Мне также нужно, чтобы эти макеты были динамическими.Таким образом, макет из 1 утверждения может отличаться от макета в следующем утверждении.(очистка их чем-то вроде beforeEach)

РЕДАКТИРОВАТЬ:

Я также пытался использовать babel-plugin-rewire для насмешки над этим модулем, это отлично работало в *Файл .test.js, где я издевался над ним.Но в реальном файле, независимо от того, что я установил для экспорта с использованием rewire, он всегда импортировался как исходный Observable.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

причина, по которой вы получаете это сообщение:

babel-plugin-jest-hoist: фабрике модулей jest.mock () не разрешено ссылаться на какие-либо переменные вне области видимости.Недопустимый доступ к переменной: из

из-за того, что jest автоматически поднимает вызовы jest.mock, чтобы они происходили до импорта.

У вас есть два варианта, чтобы обойти это поведение по умолчанию,простой способ - это использовать jest.doMock, который НЕ поднимается:

jest.doMock('./messageBus', () => ({
  loginState$: of({ isLoggedIn: true }),
}))

В качестве альтернативы, вы можете добавить к переменным все переменные, на которые ссылается фабрика mock, переданные в jest.mock, с помощью "mock":

const mockMessageBus = {
  loginState$: of({ isLoggedIn: true }),
}
jest.doMock('./messageBus', () => mockMessageBus)

(обратите внимание, что вы отвечаете за то, чтобы все фиктивные переменные, на которые есть ссылки в фабричной функции, находились в области действия при вызове jest.mock)

0 голосов
/ 17 декабря 2018

Вы близки.

Вы пытаетесь смоделировать модуль, передавая фабрику модуля в качестве второго параметра jest.mock.Основным ограничением этого подхода является то, что фабрика модулей должна быть полностью автономной и «не разрешается ссылаться на любые переменные вне области видимости».

Ссылка of из rxjs в модулеФабрика (как вы обнаружили) нарушает это ограничение и вызывает ошибку, которую вы видите.

К счастью, есть и другие способы подделки модулей.

Из того, что я вижу в вашем коде, похоже,Самый простой подход - создать Ручной макет модуля messageBus.


Создать папку __mocks__ в том же каталоге, что и messageBus.js, и создать макет(также называемый messageBus.js) в папке __mocks__.

__mocks__/messageBus.js будет выглядеть примерно так:

import { of } from 'rxjs'

export default {
  loginState$: of({ isLoggedIn: true })
}

Затем сообщите Jest, что вы хотите использовать руководствомакет в вашем тесте , позвонив

jest.mock('messageBus');

вверху вашего тестового файла.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...