Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Na aula 6.3 um dos test, não está passando é o que verifica se é um array .

Bom dia é estou tento um probleminha e não sei no que estou errando ou o que há de errado, ficarei muito grato se alguém me der uma luz, comparei com os test feito e está a mesma coisa revisei todo o codigo achei que era alguma coisa que escrevi errado. O que eu fiz:

  • Reescrevi o codigo, comparando com o existente da versão final.
  • Apaguei e reinstalei o node modules e dei um npm clean .
  • Achei que era a function de tratar erro, mas não enxerguei erro de sintaxe .

Link do repo com minha versão: https://github.com/matheusrcruz/NodeJs/tree/test

index aonde fica a função tratar erro:

const chalk = require('chalk');
const fs = require('fs');

function extraiLinks(texto) {
  const regex = /\[([^\]]*)\]\((https?:\/\/[^$#\s].[^\s]*)\)/gm;
  const arrayResultados = [];
  let temp;
  while((temp = regex.exec(texto)) !== null) {
    arrayResultados.push({ [temp[1]]: temp[2] })
  }
  return arrayResultados.length === 0 ? 'não há links' : arrayResultados;
}

function trataErro(erro) {
  throw new Error(chalk.red(erro.code, 'não há arquivo no caminho'));
}

async function pegaArquivo(caminhoDoArquivo) {
  const encoding = 'utf-8';
  try {
    const texto = await fs.promises.readFile(caminhoDoArquivo, encoding)
    return extraiLinks(texto);
  } catch(erro) {
    trataErro(erro);
  }
}

module.exports = pegaArquivo;

Exception :

$ npm run test

NodeJS@1.0.0 test C:\labs\NodeJS jest ./test

FAIL test/index.test.js pegaArquivo:: √ deve ser uma função (2 ms) × deve retornar array com resultados (2 ms)

● pegaArquivo:: › deve retornar array com resultados

ENOENT não há arquivo no caminho

  13 |
  14 | function trataErro(erro) {
> 15 |   throw new Error(chalk.red(erro.code, 'não há arquivo no caminho'));
     |         ^
  16 | }
  17 |
  18 | async function pegaArquivo(caminhoDoArquivo) {

  at trataErro (index.js:15:9)
  at pegaArquivo (index.js:24:5)
  at Object.<anonymous> (test/index.test.js:13:27)

Test Suites: 1 failed, 1 total Tests: 1 failed, 1 passed, 2 total Snapshots: 0 total Time: 0.337 s, estimated 1 s Ran all test suites matching /.\test/i. npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! NodeJS@1.0.0 test: jest ./test npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the NodeJS@1.0.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! C:\Users\home\AppData\Roaming\npm-cache_logs\2021-10-25T00_52_25_857Z-debug.log

2 respostas
solução!

Olá Matheus!

O código está certo. A única parte que está diferente é onde você chama a função pegaArquivo no arquivo index.test.js e passa o caminho do arquivo por parâmetro:

const resultado = await pegaArquivo('../test/arquivos/texto1.md')

No seu código, você passou como parâmetro o caminho relativo do arquivo; ou seja, o caminho a partir da pasta onde o código é executado. No exemplo que fizemos durante o curso, usamos o caminho absoluto do arquivo; ou seja, o caminho "completo" desde a raiz do sistema. No caso do meu computador, /home/juliana/Documents/alura/2299-lib-regex/test/arquivos/texto1.md.

Você pode resolver este bug passando o caminho absoluto dos seus arquivos de teste. Se estiver usando o Visual Studio Code, só clicar em cima do arquivo com o botão direito do mouse que vai ver as opções "copiar caminho" e "copiar caminho relativo" (ou algo similar; em inglês, "copy path" e "copy relative path"). Clique na primeira opção para copiar o caminho absoluto do arquivo e colar no código, no lugar de '../test/arquivos/texto1.md'.

Outra forma de lidar com este bug é utilizando a lib path, que vai "resolver" a parte do caminho absoluto para nós.

No arquivo index.test.js:

const path = require('path');

// outros código de teste

  it('deve retornar um array com 1 objeto de link', async () => {
    const resultado = await pegarArquivo(path.join(__dirname, './arquivos/md-teste.md'));
    expect(resultado).toEqual(retornoTeste);
  });

A lib path é nativa do NodeJS e não precisa ser instalada previamente com npm install, você só precisa importá-la para o arquivo com require como fizemos acima.

Essa lib faz muitas coisas relativas a resolver caminhos de arquivo. Acima, usamos o método join() para juntar __dirname e o caminho relativo que queremos acessar. O JavaScript acessa o restante do caminho através de __dirname e "junta" (join) as partes para formar um caminho absoluto de arquivo, sem precisarmos nos preocupar em descobrir qual é esse caminho - e em várias situações não vamos ter como fazer isso.

Saiba mais sobre path na documentação do NodeJS e também neste artigo (em inglês).

Entendi o que ocorreu obrigado, não estava pegando o caminho corretamente deu certo fiz com caminho absoluto .