Шутка виртуального макета: как мне устранить этот сбой? - PullRequest
0 голосов
/ 31 января 2020

Итак, у меня есть этот оператор импорта в модуле, который я пытаюсь протестировать, используя jest 25.1, работающий на узле 11.1.0. Оператор import предназначен для модуля, который доступен только при запуске во время выполнения jashm jvm, поэтому я использую виртуальный макет jest для управления поведением в модульных тестах. Вот как выглядит оператор импорта в тестируемом модуле:

import RequestBuilder from 'nashorn-js/request_builder'

... и после других строк в блоке импорта это:

const request = RequestBuilder.create('some-string')
.sendTo('some-other-string')
.withAction('yet-another-string')
.getResultWith( consumer => consumer.result( consumer.message().body() ) )

export const functionA = () => {...} // uses 'request' variable

export const functionB = () => {...} // uses 'request' variable

В соответствующем. spe c file, у меня есть виртуальная макетная установка:

const mockGetResultWith = {
  getResultWith: jest.fn()
}
const mockWithAction = {
  withAction: jest.fn().mockImplementation(() => mockGetResultWith)
}
const mockSendTo = {
  sendTo: jest.fn().mockImplementation(() => mockWithAction)
}
const mockBuilder = {
  create: jest.fn().mockImplementation(() => mockSendTo)
}
jest.mock(
  'nashorn-js/request_builder',
  () => mockBuilder,
  { virtual: true }
)

require('nashorn-js/request_builder')

import { functionA, functionB } from './module-under-test'

Я безуспешно пытаюсь преодолеть эту неудачу из-за шутки:

  ● Test suite failed to run

    TypeError: Cannot read property 'create' of undefined

      35 | }
      36 | 
    > 37 | const verify = RequestBuilder.create('some-string')
         |                               ^
      38 | .sendTo('some-other-string')
      39 | .withAction('yet-another-string')
      40 | .getResultWith( consumer => consumer.result( consumer.message().body() ) )

Я пробовал все виды различных макетов, используя require против import и др. c, но не нашли магию c пули.

Насколько я могу судить, не похоже, что RequestBuilder оператор import даже вызывает виртуальный макет. Или, по крайней мере, если я добавлю операторы console.log() в виртуальную фабричную функцию, я никогда не увижу эти сообщения журнала в выводе.

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

1 Ответ

0 голосов
/ 31 января 2020

Таким образом, проблема здесь заключалась в реализации import против require в файле .spe c.

Изменяя эту строку:

import { functionA, functionB } from './module-under-test'

К этому:

const module = require('./module-under-test')
const functionA = module.functionA
const functionB = module.functionB

Тестируемый модуль теперь успешно загружается, и тесты запускаются, как и ожидалось.

У меня нет объяснения этому, и я не смог найти шутку документация, описывающая, почему я получаю различное поведение между require против import. На самом деле, у меня есть фиктивная настройка конфигурации перед любыми import утверждениями, как описано здесь:

https://github.com/kentcdodds/how-jest-mocking-works

Если кто-то там понимает, что происходит с этим import поведение, или есть ссылка, описывающая то, что я пропускаю, я бы очень признателен за информацию.

...