2012-02-24 12 views
20

Tengo un archivo JavaScript simple, color.js, y un archivo de especificación que coincida, colorSpec.js.Cómo cargar un archivo para probar con el nodo Jasmine?

color.js:

function Color() 
{ 

} 

colorSpec.js:

require('./color.js'); 

describe("color", function() { 
    it("should work", function() { 
    new Color(255, 255, 255); 
    }); 
}); 

Cuando corro jasmine-node colorSpec.js, me sale el siguiente excepción:

ReferenceError: Color is not defined 

¿Cómo puede Me sale Jasmine para cargar mi archivo color.js antes de ejecutar colorSpec.js?

+0

Acabo de encontrar esto pregunta, que es similar: http://stackoverflow.com/questions/4662851/how-do-you-import-non-node-js-files – LandonSchropp

Respuesta

13

puede cargar su color.js en el colorSpec.js con un require(). No veo cómo Jasmine puede adivinar todas las dependencias sin que le cuentes a Jasmine qué son exactamente en tu archivo de especificaciones. Editar: Una solución rápida y sucia, pero tal vez no se BuiltIn algo Jazmín de hacerlo:

fs = require('fs') 
myCode = fs.readFileSync('./color.js','utf-8') // depends on the file encoding 
eval(myCode) 

entonces su clase debe estar disponible con el jazmín

Si llama necesita directamente en su archivo creo necesita crear un módulo y exportarlo

+0

Intenté agregar 'require ('./ color.js');' en la parte superior de mi archivo de especificaciones, pero sigo recibiendo excepciones de 'RefereceError'. – LandonSchropp

+0

Actualicé mi pregunta con más descripción. – LandonSchropp

+0

también actualicé mi respuesta. – mpm

5

No es así como requieren los trabajos. Su color.js necesita definir/exportar algo. Asumiré que usas require.js aquí para cordura.

color.js

define('Color', function (require) { 
    var Color = function() {}; 
    return Color; 
}); 

Luego, en su especificación:

var Color = require('color.js'); 
+1

Honestamente, no tenía planeado usar 'require.js'. Estoy creando una biblioteca de colores y no quería forzar ninguna dependencia de las personas que la usan . Su respuesta es probablemente la forma aceptada de hacer esto, pero no se ajusta a mis requisitos de proyecto. – LandonSchropp

+0

Gracias por la ayuda. Lo agradezco. – LandonSchropp

14

Al utilizar Jasmine nodo, tendrá que exportar el objeto/función/clase, en este caso de color, como un nodo módulo. Me gusta tratar de hacer mis módulos funcionan tanto en el nodo o un navegador, así:

Estructura de carpetas:

js 
    - src/ 
     color.js 
    - spec/ 
     colorSpec.js 

src/color.js

/** 
* class Color 
* 
* @constructor 
*/ 
function Color(red, green, blue) 
{ 
    var current = [red, green, blue]; 

    this.getCurrent = function() 
    { 
     return current; 
    } 
} 

// Export node module. 
if (typeof module !== 'undefined' && module.hasOwnProperty('exports')) 
{ 
    module.exports = Color; 
} 

spec/colorSpec.js

var Color = require('../src/color.js'); 

describe("Test the Color object", function() { 
    var color = new Color(255, 255, 255); 

    it('to verify that it can return a color.', function() { 
     expect(color.getCurrent()).toContain(255); 
    }); 
}); 
+0

Gracias. Una pregunta: ¿puedo omitir la lógica de verificación de existencia de 'módulo'? ¿Cuándo puede 'module' estar' undefined'? –

+1

Si nunca planea ejecutar esto en un navegador, entonces sí. – b01

Cuestiones relacionadas