9
respostas

Teste não funciona (resolvido)

Esse é o codigo q estou tentando executar:

 import getFile from '../index.js';
// const getFile = require('../index');

test('deve ser uma função', () => {
    expect(typeof getFile).toBe('function');
});

Aparece essa msg:

{"Object.<anonymous>":function(module,exports,require,__dirname,__filename,jest){import getFile from '../index.js'; // const getFile = require('../index');
                                                                                      ^^^^^^

    SyntaxError: Cannot use import statement outside a module

      at Runtime.createScriptFromCode (node_modules/jest-runtime/build/index.js:1728:14)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        0.733 s
Ran all test suites matching /.\/test\/index.test.js/i.
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! md-links@0.1.0 test: `jest ./test/index.test.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the md-links@0.1.0 test script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/CaroAlvim/.npm/_logs/2021-12-30T01_10_16_832Z-debug.log
9 respostas

Agora to tentando assim:

import getFile from '../index';
// const getFile = require('../index');

describe('getFile', () => {
    it('deve ser uma função', () => {
        expect(typeof getFile).toBe('function');
    })

})

e a msg q recebo é:

 ✓ 0 passing

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! md-links@0.1.0 test: `jest ./test/index.test.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the md-links@0.1.0 test script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/CaroAlvim/.npm/_logs/2021-12-30T16_20_10_638Z-debug.log

Olá, Carolina!

Referente ao seu primeiro post, para fazer a importação e exportação de módulos no curso utilizamos a sintaxe CJS (common JS), por motivos de compatibilidade do NodeJS. Porém, nesse momento está rolando uma "transição" do CJS para o ESM (EcmaScript Modules, que usa a sintaxe import/export e você está usando no exemplo) então várias bibliotecas estão atualizando para permitir essa sintaxe. Só lembrar que, se for mudar de uma forma para outra, conferir se todos os arquivos do projeto estão usando a mesma sintaxe para importar e exportar - o CJS e o ESM não são intercambiáveis.

Agora, com relação ao seu erro no teste: O Jest está apenas "repassando" o erro para a frente. O erro ELIFECYCLE é específico do NodeJS e normalmente significa que algo causou uma interrupção não esperada do programa (end of life cycle), então teríamos que olhar um pouco mais o restante do código para ver o que pode estar causando.

Se quiser, você pode conferir esta issue (em inglês) no repositório do Jest, onde estão debatendo o porque do Jest exibir esse erro, mesmo conseguindo executar o teste (como no seu caso, que exibiu no console ✓ 0 passing).

Estou com um problema semelhante, para utilizar a sintaxe import eu segui esse tutorial: https://www.youtube.com/watch?v=kA9Pdu-IblI&ab_channel=Benji, que ensina a configurar o babel, mas mesmo assim eu recebo o seguinte erro:

SyntaxError: Cannot use import statement outside a module

    > 1 | import chalk from 'chalk';
        | ^
      2 | import fs from 'fs';

meu package.json:

{
  "name": "lib-markdown",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "test": "jest ./test --coverage",
    "cli": "node cli.js './files/file1.md'"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "chalk": "^5.0.0",
    "fs": "^0.0.1-security",
    "node-fetch": "^3.1.0"
  },
  "devDependencies": {
    "@babel/preset-env": "^7.16.7",
    "babel-jest": "^27.4.5",
    "chalk": "^5.0.0",
    "fs": "^0.0.1-security",
    "jest": "^27.4.5",
    "node-fetch": "^3.1.0"
  },
  "jest": {
    "moduleFileExtensions": ["js", "jsx"],
    "moduleDirectories": ["node_modules"]
  }
}

meu .babelrc

{
    "presets": ["@babel/preset-env"]
}

e a sintaxe de todo o resto do projeto utiliza import ao invés do require

Olá Raphael,

Dei uma olhada no código do vídeo que você mandou e a solução do Babel funciona certinho para a v27 do Jest.

Sobre o erro SyntaxError: Cannot use import statement outside a module, eu converti o código completo do projeto para a sintaxe import/export do ESM (mantendo o Babel) e consegui reproduzir o erro. Para corrigir, você pode deixar explícito o tipo de módulo que será utilizado no projeto, adicionando a propriedade "type": "module" em qualquer parte do package.json:

{
  "name": "nome-da-sua-lib",
  // outras infos
  "type": "module",
  // outras infos
}

Outra coisa importante é que, quando usamos o ESM, é preciso deixar explícita também a extensão dos arquivos de onde estamos importando/exportando os módulos. Por exemplo:

import pegarArquivo from './index.js';
import arrayValidado from './http-validate.js';

Confira que todas as importações de módulos que venham de outros arquivos locais estejam com a extensão .js no final. Para os módulos que estão na pasta node_modules (ou seja, os que instalamos de libs externas com npm install <nome-da-lib>), as importações continuam só com o nome da lib:

import fetch from 'node-fetch';
import chalk from 'chalk';

Isso deve corrigir o problema.

Obs: Uma vez que o Chalk já está instalado como dependência do projeto, não precisa listar a lib novamente como devDependencies :)

Bons estudos! ;)

Boa noite Juliana, testei aqui e mesmo com o type modules e as alterações propostas o erro permanece inalterado, poderia compartilhar os seus arquivos de configuração?

Oi, Raphael,

Seguem:

{
  "name": "aquijuz-libmarkdown",
  "version": "1.0.3",
  "description": "Find the [link](URL) pattern in markdown files",
  "keywords": [
    "markdown",
    "URL"
  ],
  "main": "./src/cli.js",
  "bin": {
    "aquijuz-markdown": "./src/cli.js"
  },
  "type": "module",
  "preferGlobal": true,
  "scripts": {
    "test": "jest ./test",
    "cli": "node ./src/cli.js"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/JulianaAmoasei/2299-js-regexlib.git"
  },
  "author": "Juliana Amoasei",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/JulianaAmoasei/2299-js-regexlib/issues"
  },
  "homepage": "https://github.com/JulianaAmoasei/2299-js-regexlib#readme",
  "dependencies": {
    "chalk": "^5.0.0",
    "node-fetch": "^2.6.1"
  },
  "devDependencies": {
    "@babel/preset-env": "^7.16.7",
    "babel": "^6.23.0",
    "babel-jest": "^27.4.5",
    "eslint": "^7.32.0",
    "eslint-config-airbnb-base": "^14.2.1",
    "eslint-plugin-import": "^2.23.4",
    "jest": "^27.0.6"
  }
}

Se você quiser, pode compartilhar o link do seu repositório no github para verificarmos.

Bem, realizei um teste utilizando a mesma versão do chalk que está no repositório do curso e os testes funcionaram, mas quando retorno para a versão ^5.0.0 os erros de import citados acima voltam a ocorrer, segue o projeto no git: https://github.com/RaphaSalomao/lib-markdown

Segui o video do Raphael ( esse -> https://www.youtube.com/watch?v=kA9Pdu-IblI )

De acordo com o rapaz do video, o problema estava no tipo de modelo de import. A nova versao que usa "export default" precisa ser convertida para funcionar no Jest, por isso instalei o babel-jest, babel/preset-env para não ter mais problemas com o export/import.

usei o comando npm install --save-dev jest babel-jest @babel/preset-env

e na raiz do projeto, criei o arquivo .babelrc com o seguinte código: { "presets": ["@babel/preset-env"] } e ainda assim, o teste não funcionou.

**Como resolvi:

rodei esse comando: npm i --save-dev babel-plugin-transform-es2015-modules-commonjs

no package-json, adicionei:

    "jest": {
    "transform": {}
}

e no script de test, ficou assim:

"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",

no arquivo .babelrc ficou assim:

{
    "plugins": ["transform-es2015-modules-commonjs"]
}

instalei npm i --save-dev @babel/core

e finalmente funcionou!

Link pra entender o problema -> https://gabrieluizramos.com.br/modulos-em-javascript

Meu github, caso eu tenha esquecido algo https://github.com/caroAlvim/SAP006-md-links/

Oi Raphael!

Fiz vários testes com o seu código:

  • se deletar a importação do Chalk e as chamadas dessa lib, os testes voltam a rodar normalmente
  • se só executar o código do projeto com npm run cli o Chalk e o resto do código funcionam normalmente

Parece ser algum tipo de bug de incompatibilidade entre a v5 do Chalk e o Jest. Como o NodeJS passou a aceitar a sintaxe do ESM (import/export) meio que recentemente, várias bibliotecas estão se adaptando e lançando novas versões, o que às vezes pode causar bugs mesmo, que podem ter até relação com a sua versão do NodeJS ou do seu sistema operacional.

Fazendo o downgrade para o Chalk v4.1.2 tudo volta a funcionar bem. Nesse caso, não precisa fazer nenhum outro dos passos que a Carolina fez no projeto dela, só o downgrade de versão deve ser suficiente; por via das dúvidas, você pode deletar a pasta node_modules e reinstalar todas as dependências.

Espero ter ajudado! Bons estudos! ;)