Модульный тест с Jest выдает ошибку типа: File.test.js : Не удается прочитать свойство ‘toString’ неопределенного

#react-native #jestjs #expo #babeljs #babel-jest

#react-native #jestjs #выставка #babeljs #babel-jest

Вопрос:

Я работал в React Native с использованием Expo CLI и недавно начал сталкиваться с проблемой с моими модульными тестами, которые завершились неудачей по одной общей причине. Трассировка стека приведена ниже

 Cannot read property 'toString' of undefined

      at Converter.toBase64 (node_modules/convert-source-map/index.js:61:46)
      at Converter.toComment (node_modules/convert-source-map/index.js:65:21)
      at generateCode (node_modules/@babel/core/lib/transformation/file/generate.js:78:76)
      at run (node_modules/@babel/core/lib/transformation/index.js:55:33)
          at run.next (<anonymous>)
      at transform (node_modules/@babel/core/lib/transform.js:27:41)
          at transform.next (<anonymous>)
      at evaluateSync (node_modules/gensync/index.js:244:28)
      at sync (node_modules/gensync/index.js:84:14)
  

Моя версия узла — node: 12.18.4. Интересно, что вызвало эти ошибки, поскольку все работало отлично. В моей локальной системе они работают нормально, иногда, но процесс CI имеет тенденцию к случайному сбою, что снижает общие показатели покрытия кода.

Модульный тест, который я пытаюсь запустить, очень прост, как написано ниже

 it('Renders Strings as expected', () => {
  expect(received).toStrictEqual(expected)
})
  

Ответ №1:

Для тех из вас, кто все еще блуждает в поисках ответа на приведенный выше вопрос. Проблема заключалась в самой библиотеке convert-source-map, которая должна была обрабатывать это исключение.

Я разветвил фактический репозиторий и обработал это исключение в строке 64 методом toBase64. Теперь метод выглядит как что-то

 Converter.prototype.toBase64 = function () {
  var json = this.toJSON();
  return (SafeBuffer.Buffer.from(json, 'utf8') || "").toString('base64');
};
  

Теперь все работает нормально.

Оригинальный метод был примерно таким

 Converter.prototype.toBase64 = function () {
  var json = this.toJSON();
  return SafeBuffer.Buffer.from(json, 'utf8').toString('base64');
};