Неудачный тестовый модуль Jest с `ReferenceError` из модуля пакета NPM - PullRequest
0 голосов
/ 15 февраля 2019

Я получаю неудачные тесты после установки пакета NPM (один из моих собственных пакетов).

В частности, я получаю ReferenceError: cc is not defined, а трассировка стека ведет к одному из экспортов вмой пакет NPM.

cc - это объект из игровой платформы (Cocos2d-x), который включен в мой проект локально.

Фреймворк игры не включена в мой пакет NPM, но пакет ссылается на объект, предполагая, что в любом проекте, в котором установлен пакет, также будет включена игровая среда.По сути, Cocos2d-x является зависимостью от однорангового узла, но не указана как единая, поскольку это не сам пакет NPM.

Код, который я тестирую в моем проекте, не имеет никакого отношения к игровой среде.И методы, которые я импортирую из моего пакета NPM, не имеют никакого отношения к игровой среде.Я импортирую эти методы, используя деструктурирование (например, import { helper1 } from 'my-package').

С учетом сказанного, я не ожидаю, что это станет проблемой.Но Jest не нравится тот факт, что на cc ссылаются из совершенно другого экспорта в моем пакете NPM (тот, который не импортируется в тестируемый файл).Другими словами, helper2 вызывает сбой Jest, поскольку он ссылается на cc, но helper2 не импортируется.

Как мне исправить ошибку, чтобы тесты прошли?

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

вы пытались создать облегченную версию?

облегченная версия

об этом шла дискуссия на форуме cocos2d

0 голосов
/ 25 февраля 2019

В моем конкретном случае проблема была в одном из моих экспортов из пакета NPM, который выглядит примерно так:

// NOTE: cc is undefined, with assumption that any project installing the NPM package will have
// the required game framework
class BackgroundLayer extends cc.Node {}
export default BackgroundLayer;

Решением было просто добавить глобальные переменные в конфигурацию Jest моего проекта, вот так:

"jest": {
  "globals": {
    "cc": {
      "Node": null
    }
  }
}

На данный момент мне все еще неясно, стоит ли ожидать этого.Другими словами, если Jest должен провалить юнит-тест, который не имеет ничего общего с не импортированным экспортом.

0 голосов
/ 21 февраля 2019

Я пытался воссоздать среду, похожую на вашу, и я не смог воспроизвести эту ошибку:


/so
  foo/
    index.js
    package.json
  answer.test.js
  package.json

Вот содержание ./package.json: (Как выможно видеть, что он имеет foo в качестве зависимости)

{
  "name": "so",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "test": "jest"
  },
  "devDependencies": {
    "jest": "^24.1.0"
  },
  "dependencies": {
    "foo": "./foo"
  }
}

Вот содержание ./foo/package.json:

{
  "name": "foo",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT"
}

А вот ./foo/index.js: (Как видите, helper2 ссылается на глобальную переменную, которая не определена.)

module.exports = {
  helper1: () => 42,
  helper2: () => cc
};

Теперь тестовый файл:

const {helper1} = require('foo');

test('helper1 returns the answer', () => {
  expect(helper1()).toBe(42);
});

Когда я запускаю тест (yarn test), тест проходит без ошибок и предупреждений.Так что не похоже, что Jest беспокоит наличие метода, ссылающегося на глобальный объект, который находится вне области действия.

Возможно, вы могли бы использовать параметры конфигурации Jest:

  1. globals

    Набор глобальных переменных, которые должны быть доступны во всех средах тестирования.

  2. setupFiles

    Список путей к модулям, которые запускают некоторый код для настройки или настройки среды тестирования.Каждый файл настройки запускается один раз для каждого тестового файла.Поскольку каждый тест выполняется в своей собственной среде, эти сценарии будут выполняться в среде тестирования непосредственно перед выполнением самого кода теста.

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