Как использовать Jest с React Native

Раздел тестирования документов для React Native предполагает, что Jest является официальным способом проведения модульных тестов. Однако они не объясняют, как настроить его. Запуск Jest без какой-либо установки дает синтаксические ошибки (без номеров строк:(), потому что он не применяет преобразования (например, функции ES6, JSX и поток), которые, как правило, используют React Native. Там находится папка jestSupport в React Исходный источник пытается содержать env.js и scriptPrerocess.js, последний имеет код для применения преобразований. Поэтому я скопировал их в свой проект и добавил следующий раздел в свой пакет package.json:

  "jest": {
    "scriptPreprocessor": "jestSupport/scriptPreprocess.js",
    "setupEnvScriptFile": "jestSupport/env.js"
  },

Это исправляет первую ошибку, но я все равно получаю следующую ошибку:

Using Jest CLI v0.4.0
 FAIL  js/sync/__tests__/SynchronisedStorage-tests.js
SyntaxError: /Users/tom/my-project/js/sync/__tests__/SynchronisedStorage-tests.js: /Users/tom/my-project/js/sync/SynchronisedStorage.js: /Users/tom/my-project/node_modules/react-native/Libraries/react-native/react-native.js: /Users/tom/my-project/node_modules/react-native/node_modules/react-tools/src/browser/ui/React.js: /Users/tom/my-project/node_modules/react-native/node_modules/react-tools/src/utils/ReactChildren.js: /Users/tom/my-project/node_modules/react-native/node_modules/react-tools/src/addons/ReactFragment.js: /Users/tom/my-project/node_modules/react-native/node_modules/react-tools/src/classic/element/ReactElement.js: /Users/tom/my-project/node_modules/react-native/node_modules/react-tools/src/core/ReactContext.js: /Users/tom/my-project/node_modules/react-native/node_modules/react-tools/src/vendor/core/warning.js: Unexpected token .
1 test failed, 0 tests passed (1 total)
Run time: 0.456s

Есть ли еще что мне нужно сделать, чтобы Jest понял React Native? Есть ли примеры установки Jest для тестирования React Native?

EDIT:

В scriptPreprocess произошла проверка, которая помешала ему запустить какой-либо файл в node_modules, который, конечно же, включал всю React Native. Удаление, которое исправляет ошибку выше. Однако теперь я получаю больше ошибок от источника React Native, он определенно кажется, что он не предназначен для запуска в Jest.

EDIT2:

Явная настройка макета для модуля react-native работает:

jest.setMock('react-native', {});

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

Ответы

Ответ 1

У меня есть Jest для работы с моим React Native, и он без проблем запускает тесты на файлы с преобразованиями ES6 и ES7.

Чтобы заставить Jest работать, я выполнил следующие шаги:

  • Скопирована папка jestSupport из репозитория React Native master в мою папку react-native в node_modules.

  • Отредактировал строку "jest" в моей packages.json, чтобы указать на файлы в папке jestSupport

Теперь строка "jest" в моем packages.json выглядит следующим образом:

"jest": {
  "scriptPreprocessor": "<rootDir>/node_modules/react-native/jestSupport/scriptPreprocess.js",
  "setupEnvScriptFile": "<rootDir>/node_modules/react-native/jestSupport/env.js",
  "testFileExtensions": [
    "js"
  ],
  "unmockedModulePathPatterns": [
    "source-map"
  ]
},

Ответ 2

Как и в случае с React Native v0.37.0, Jest является частью нового шаблона приложения.

В новом приложении вы можете сразу запустить тесты:

$ react-native init MyAwesomeApp
$ cd MyAwesomeApp
$ npm test
...
Tests:       2 passed

Ответ 3

Для более новых версий jest настройка его для react-native очень проста.

Установите jest с помощью

npm install --save-dev jest-cli babel-jest

В package.json добавьте это

"scripts": {
  "start": "babel-node ./server/server.js",
  "import-data": "babel-node ./scripts/import-data-from-parse.js",
  "update-schema": "babel-node ./server/schema/updateSchema.js",
  "test": "jest",
  "lint": "eslint ."
},
"jest": {
  "haste": {
    "defaultPlatform": "ios",
    "platforms": [
      "ios",
      "android"
    ],
    "providesModuleNodeModules": [
      "react-native"
    ]
  }
},

Вам может потребоваться добавить строки, связанные со шуткой

Теперь вы можете использовать

npm test

для запуска шутки.

Обратитесь к f8app github repo, чтобы найти больше об этом.