Кодировка не распознается в jest.js

У меня проблема с тестированием проекта с использованием node-mysql2, реагирует, развивается и шутит. Эта проблема возникает только во время тестирования.

Encoding not recognized: 'cesu8' (searched as: 'cesu8')
    at Object.getCodec (project/node_modules/mysql2/node_modules/iconv-lite/lib/index.js:106:23)
    at Object.getDecoder (project/node_modules/mysql2/node_modules/iconv-lite/lib/index.js:122:23)
    at Object.<anonymous>.exports.decode (project/node_modules/mysql2/lib/parsers/string.js:9:23)
    at Packet.Object.<anonymous>.Packet.readNullTerminatedString (project/node_modules/mysql2/lib/packets/packet.js:373:23)
    at Function.Object.<anonymous>.Handshake.fromPacket (project/node_modules/mysql2/lib/packets/handshake.js:18:31)
    at ClientHandshake.Object.<anonymous>.ClientHandshake.handshakeInit (project/node_modules/mysql2/lib/commands/client_handshake.js:98:38)
    at ClientHandshake.Object.<anonymous>.Command.execute (project/node_modules/mysql2/lib/commands/command.js:40:20)
    at Connection.Object.<anonymous>.Connection.handlePacket (project/node_modules/mysql2/lib/connection.js:515:28)
    at PacketParser.onPacket (project/node_modules/mysql2/lib/connection.js:94:16)
    at PacketParser.executeStart (project/node_modules/mysql2/lib/packet_parser.js:77:14)
    at Socket.<anonymous> (project/node_modules/mysql2/lib/connection.js:102:29)

5 ответов

Решение

Эта проблема вызвана тем, что mysql2 выполняет динамические ленивые запросы кодировок, а Jest не может справиться с этим. Взгляните на несколько предложенных здесь решений:

добавить этот фрагмент к setupTestFrameworkScriptFile

require('mysql2/node_modules/iconv-lite').encodingExists('foo');

или это где-то в начале вашего кода:

import iconv from 'iconv-lite';
import encodings from 'iconv-lite/encodings';
iconv.encodings = encodings;

На самом деле нужно только добавить:

require('iconv-lite').encodingExists('foo')

в начало любого файла, который вы тестируете, например, factory.test.js

Не уверен, почему это, к сожалению, но выше, лучше для копирования / вставки, чем выбранный ответ.

В моем случае ошибка кодирования появилась послеReferenceError

Причиной был тестовый вызов метода, который выполнял асинхронный вызов базы данных черезmysql2за что я забыл.

Решение для меня состояло в том, чтобы просто добавитьawaitВ правильном месте.

      
ReferenceError: You are trying to `import` a file after the Jest environment has been torn down. From models/alert.test.js.

      at Object.getCodec (node_modules/mysql2/node_modules/iconv-lite/lib/index.js:63:27)
      at Object.getDecoder (node_modules/mysql2/node_modules/iconv-lite/lib/index.js:125:23)
      at Object.<anonymous>.exports.decode (node_modules/mysql2/lib/parsers/string.js:10:25)
      at Packet.readNullTerminatedString (node_modules/mysql2/lib/packets/packet.js:412:25)
      at Function.fromPacket (node_modules/mysql2/lib/packets/handshake.js:62:33)                ^
...
Error: Encoding not recognized: 'cesu8' (searched as: 'cesu8')
    at Object.getCodec (/Users/.../node_modules/mysql2/node_modules/iconv-lite/lib/index.js:104:23)
      require('../../node_modules/mysql2/node_modules/iconv-lite/lib').encodingExists('foo');

Это сработало для меня на

  • Узел 16.17.1
  • ц 4.8.4
  • шутка 29.2.2

Я столкнулся с аналогичной проблемой с модулем node. Я сделал обходной путь, издеваясь над networkмодуль и не использовать iconv-lite. Ниже приведен мой код.

      jest.mock('network', () => ({
  get_active_interface: cb => {
    cb?.(undefined, { type: 'Wired' });
  },
}));

Что касается этого случая, может быть, вы могли бы попробовать mockмодуль, который сделал вызов, такой код.

      jest.mock('mysql2',()=>({
    someFuncThatCallsIcoveLite:(..._)=>{} 
}))
Другие вопросы по тегам