Jest: ошибка при попытке импортировать собственные модули;невозможно предотвратить с помощью макета - PullRequest
0 голосов
/ 28 ноября 2018

Меня недавно пригласили в команду в качестве инженера по тестированию, и я пытаюсь запустить модульные тесты Jest в нашем приложении React Native.Мой предшественник уже создал десятки модульных тестов, большинство из которых не были успешно выполнены.

При выполнении npm test

 FAIL  __tests__/index.test.js
  ● Test suite failed to run

TypeError: Cannot read property '_addDeviceToGroup' of undefined

  4 | } from 'react-native';
  5 | const {
> 6 |   _addDeviceToGroup,
    |   ^
  7 | } = NativeModules._BleAssociator
  8 | const {
  9 |   _queryName,

  at Object._addDeviceToGroup (app/utils/mesh.js:6:3)
  at Object.<anonymous> (app/actions/hierarchy.js:26:1)
  at Object.<anonymous> (app/actions/organizations.js:14:1)

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

После некоторых исследований я решил исходить из предположения, что это связано с неспособностью Jest проанализировать Objective-C в движке, который питается в собственных модулях, а не с какими-то проблемами с нашим стеком (радно учтите эту возможность).

Я рассмотрел документацию Jest, специально прочесав пару соответствующих документов ( Макетные функции , Использование Jest с импортом модуля ES , Тестирование собственных модулей с помощью Jest Mock , Руководство по собственным модулям React )

Моя проблема, похоже, эта проблема ;однако, исправление не работает для меня.Даже при издевательстве над NativeModules я получаю ту же ошибку.

Мне знакомо представление о том, что макеты Jest поднимаются над операторами импорта, но мне не ясно, почему макеты находятся в блоке descriptionв вышеупомянутой проблеме (кроме, может быть, сброса функции макета для каждого нового теста на случай, чтобы не перепутать возвращаемые данные свойства .mock ... я отвлекся).

Мне кажется,ошибка происходит во время импорта перед выполнением любого кода.Чтобы проверить это, я ходил взад-вперед, комментируя все, кроме операторов импорта и макетов.Делая это, я все еще получаю ту же ошибку.Это также тот случай, когда я использую оператор mocha beforeEach (), как в решении проблемы, связанной с выше.

Единственное, что исправляет эту ошибку, это комментирует импорт в целом.

Я не пробовал обрабатывать ошибки (try / catch), так как я не уверен, как все еще успешно импортировать проверяемый компонент, если выполняется блок catch.

Извините за весь этот фон.Я потратил на это пару рабочих дней, поэтому хочу убедиться, что все мои базы покрыты.

Вот пример теста:

/__tests__/app/components/Onboarding/Splash/Splash.test.js

import {
  NativeModules,
} from 'react-native';

import { Splash } from '../../../../../app/components/Onboarding/Splash/Splash.js';
// import login from '../../../../../app/actions/login';

// NativeModules._BleAssociator._addDeviceToGroup = jest.fn();
// login = jest.fn;

export default function({React, shallow}) {

  const props = {
    // some test props
  };

  function make({navigation, getUserInfo, verifyUser, login} = props) {
    return shallow(
      // renders the component with props
    );
  }

  describe('<Splash />', () => {
    // I added this part (didn't help)
    beforeEach(() => {
      NativeModules._BleAssociator._addDeviceToGroup = jest.fn();
      login = jest.fn;
    });
    // end part I added
    
    // stuff (all the tests are in here)

  });

}

Импорт NativeModules и входа в систему, закомментированные строки и блок beforeEach () - это то, что я пытался периодически безрезультатно.

Когдапытаясь отследить эту ошибку, я обнаружил, что комментирование оператора импорта в исходном Splash.js, который запускает сценарии (поскольку импорт ES6 запускает сценарий, на который он ссылается), пытающийся импортировать NativeModules, исправляет ошибку, которую я вижу.Как вы уже могли почерпнуть из стековой трассировки, они идут на многие уровни глубиной.

PHEW.Если вы читали это далеко, я действительно ценю помощь.

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

Мне бы понравилось, если это крошечное исправление, которое я пропустил или былокакой-то «мелкий» импорт, о котором я не знаю.

Спасибо, Баджиллион, за вашу помощь.Любые входные данные приветствуются.

1 Ответ

0 голосов
/ 28 ноября 2018

Я нашел решение для этого.Я волновался, что, возможно, насмешки не отслеживались во всем операторе импорта.На самом деле я неправильно форматировал макеты.

Я не видел этого в стандартной документации Jest, но вместо этого нашел здесь .

Добавление этого вМои файлы * .test.js сработали:

import { NativeModules } from 'react-native';
jest.mock('NativeModules', () => {
  return {
    _BleAssociator: {
      _addDeviceToGroup: jest.fn()
    },
    // ... and so on for all the other methods expected in NodeModules
  };
});

Просто ради потомков, я думаю, это лучше всего сохранить в своем собственном сценарии и импортировать в тесты ... Я еще не пробовал.

...