El siguiente código JavaScript funciona:
let Color = require('color'); class Example { its_not_easy_being_green() { return Color('green'); } } test('It is not easy being green', () => { expect(new Example().its_not_easy_being_green()).toBeDefined(); }) y npx jest me consigue una barra verde.
$ npx jest PASS test/example.spec.js ✓ It is not easy being green (2 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 0.351 s, estimated 1 s Ran all test suites.Sin embargo, cada vez que trato de separar la clase de la prueba, recibo varios errores:
El más común es el de no poder usar la importación fuera de un módulo.
O ese Example no es un constructor.
Lo que estoy tratando de hacer es sacar todo lo que no sea la prueba de tres líneas del archivo JavaScript que publiqué anteriormente.
Si esto fuera Java, movería esas cosas a un archivo .java separado y luego import ese archivo en mi prueba.
Si esto fuera C, habría un enlazador y #include involucrados.
Lo que he intentado es crear un archivo Example.js :
let Color = require('color'); class Example { its_not_easy_being_green() { return Color('green'); } } y luego require en la prueba:
let Example = require('Example.js') test('It is not easy being green', () => { expect(new Example().its_not_easy_being_green()).toBeDefined(); }) Pero eso me hace quejarme de que Example no es un constructor, lo cual, supongo, es cierto. Es una clase, que presumiblemente tiene un constructor predeterminado bastante inerte de algún tipo.
También intenté reemplazar el require con una import :
import('Example.js') test('It is not easy being green', () => { expect(new Example().its_not_easy_being_green()).toBeDefined(); }) Pero eso recibe quejas de que no se le permite usar la import fuera de un módulo.
¿Es posible separar la prueba de broma del código que se prueba en JavaScript?
No hay #include en Javascript; en su lugar, utiliza un sistema de módulos en el que export cosas que desea compartir.
Es mejor aprender las herramientas que ofrece el idioma en lugar de tratar de forzarlo a hacer algo de la forma en que lo hace un idioma diferente.
Además, tenga en cuenta que hay dos tipos de módulos en nodejs, módulos CommonJS que usan require() y module.exports y módulos ESM que usan import y export . Su proyecto parece estar configurado para CommonJS, así que eso es lo que usaría a menos que desee configurar el proyecto para que sea un proyecto de módulo ESM y luego use las reglas de ESM para importar y exportar.
Para un proyecto CommonJS:
const Color = require('color'); class Example { its_not_easy_being_green() { return Color('green'); } } module.exports.Example = Example;Luego, en su archivo principal:
const { Example } = require('./Example.js') test('It is not easy being green', () => { expect(new Example().its_not_easy_being_green()).toBeDefined(); }); FYI, require(someModule) te da lo que fue module.exports . Si asigna algo directamente a module.exports como:
// in color.js module.exports = function Color() { // do something here }Entonces, lo usarías así:
const Color = require('color'); Pero, si solo agrega una propiedad al objeto module.exports como este:
// in Example.js const Color = require('color'); class Example { its_not_easy_being_green() { return Color('green'); } } module.exports.Example = Example; Luego, debe obtener la propiedad .Example del objeto exportado de cualquiera de estas formas:
const { Example } = require('./Example.js'); const Example = require('./Example.js').Example; const exampleExports = require('./Example.js'); const Example = exampleExports.Example;Tenga en cuenta los corchetes en la sintaxis:
const { Example } = require('./Example.js');se denomina "desestructuración de objetos" y es una sintaxis abreviada.
El método color.js anterior se realiza cuando solo hay una exportación principal del módulo, por lo que en lugar de exportar un objeto, exporta la función directamente.
El método example.js anterior se realiza cuando tiene más de una exportación principal del módulo (o desea conservar la flexibilidad para tener más de una exportación de nivel superior en el futuro) como esta:
// in Example.js const Color = require('color'); class Example { its_not_easy_being_green() { return Color('green'); } } class SubExample extends Example { its_not_easy_being_red() { return Color('red'); } } // multiple exports module.exports.Example = Example; module.exports.SubExample = SubExample;