Olá Gustavo, tudo bem?
O que você está enfrentando é uma limitação do jsdom
. O jsdom
é uma biblioteca que simula um ambiente de navegador no Node.js, mas ele não implementa todas as funcionalidades que um navegador real possui.
No caso do input do tipo file
, o jsdom
não tem a capacidade de simular a seleção de arquivos, pois isso envolve interações com o sistema de arquivos do usuário, algo que um ambiente de servidor como o Node.js não pode fazer por questões de segurança.
Quando você usa document.querySelector('#file').files
, está tentando acessar a propriedade files
de um elemento de input do tipo file
, que em um navegador real seria preenchida quando o usuário seleciona um arquivo. No jsdom
, essa propriedade permanece vazia porque não há interação real do usuário para selecionar um arquivo.
Se você precisa testar essa funcionalidade, uma abordagem seria simular a seleção de arquivos nos seus testes. Você pode criar um objeto File
manualmente e atribuí-lo ao elemento de input no seu código de teste. Aqui está um exemplo de como você pode fazer isso:
const { JSDOM } = require('jsdom');
const fs = require('fs');
JSDOM.fromFile('templates/editar.handlebars').then((dom) => {
const { document } = dom.window;
const fileInput = document.querySelector('#file');
// Simulando um arquivo
const file = new dom.window.File(['conteúdo do arquivo'], 'arquivo.txt', {
type: 'text/plain',
});
// Atribuindo o arquivo simulado ao input
Object.defineProperty(fileInput, 'files', {
value: [file],
});
console.log(fileInput.files[0].name); // Deve imprimir 'arquivo.txt'
});
Dessa forma, você pode testar a lógica do seu código sem precisar de uma interação real com o sistema de arquivos do usuário.
Espero ter ajudado e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.