Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

171
Vistas
Mocha encuentra que la variable global no está definida cuando se extiende por clase

Tengo el siguiente módulo ES6 de un receptor Chromecast que me gustaría probar usando Mocha...

 // SUT - app.js import { Queue } from 'queue.js' export const app = async () => { const context = cast.framework.CastReceiverContext.getInstance(); const options = {}; options.queue = new Queue(); context.start(options); }

Este código se ejecuta dentro de un agente de usuario de Chromecast que brinda acceso al objeto de transmisión global. Este objeto de transmisión expone una API que, a su vez, permite que el subproceso JS interactúe directamente con el SDK de CAF de Chromecast. Esta variable de conversión siempre está disponible en tiempo de ejecución.

La clase Queue es un poco inusual porque para que funcione de acuerdo con la documentación del marco CAF, debe extender una clase abstracta del marco cast.framework.QueueBase ...

 // queue.js class Queue extends cast.framework.QueueBase { initialize(){ // build queue here } }

Ahora me gustaría escribir algunas pruebas unitarias para verificar que la función de mi app sea correcta. Por ejemplo:

 // app.test.js import { app } from 'app.js'; it('should do some stuff', async function () { // inject a mock cast object global.cast = { framework: { QueueBase: class {}, CastReceiverContext: { getInstance: () => {}, }, }, }; await app(); // Make some assertions });

Sin embargo, aunque estoy inyectando un simulacro usando global.cast , que es suficiente para todas las referencias regulares al objeto emitido, en el caso de que una clase extienda el objeto emitido inyectado, aparentemente aún no está disponible y recibo lo siguiente error:

ReferenceError: cast no está definido

Encontré un truco feo para hacer desaparecer este error. Si coloco el siguiente fragmento encima de la declaración de clase, entonces puedo inyectar el simulacro en tiempo de ejecución y no solo funciona para Mocha sino también para la ejecución en el dispositivo Chromecast...

 try { // The following line throws in Mocha's node environment // but executes fine on the Chromecast device if (cast) { } } catch { global.cast = { framework: { QueueBase: class {}, }, }; } export class Queue extends cast.framework.QueueBase { ...

Sin embargo, me gustaría encontrar una mejor solución para no tener que contaminar mi código de producción con este truco que solo está ahí para permitirme ejecutar pruebas.

Mi archivo .mocharc.yml se ve así:

 require: - '@babel/register' - 'ignore-styles' - 'jsdom-global/register' - 'babel-polyfill'

... y mi comando para ejecutar pruebas es:

moca --recursivo --use_strict

finalmente, mi archivo .babelrc se ve así:

 { "presets": [ [ "@babel/preset-env" ] ], "plugins": [ "inline-svg", "import-graphql" ] }
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Las importaciones estáticas siempre se evalúan primero, por lo que el orden de las operaciones es aproximadamente:

 import { Queue } from 'queue.js'
 class Queue extends cast.framework.QueueBase { // ReferenceError outside Chromecast! initialize(){ // build queue here } }
 global.cast = { framework: { QueueBase: class {}, CastReceiverContext: { getInstance: () => {}, }, }, };

Puede ver que el simulacro se crea después de la referencia para cast en app.js.

La única forma confiable de ejecutar la creación simulada antes de importar el módulo de la aplicación es usar una importación dinámica:

 // app.test.js it('should do some stuff', async function () { // inject a mock cast object global.cast = { framework: { QueueBase: class {}, CastReceiverContext: { getInstance: () => {}, }, }, }; const { app } = await import('app.js'); await app(); // Make some assertions delete global.cast; });

Si prefiere no repetir la creación del simulacro y la import en cada prueba, puede sacar ambas de la definición de la prueba:

 // app.test.js // inject a mock cast object global.cast = { framework: { QueueBase: class {}, CastReceiverContext: { getInstance: () => {}, }, }, }; const { app } = await import('app.js'); it('should do some stuff', async function () { await app(); // Make some assertions }); // Optionally clean up the mock after all tests after(() => delete global.cast);
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda