2012-02-24 7 views
20

Ho un semplice file JavaScript, color.js e un file spec corrispondente, colorSpec.js.Come caricare un file per il test con il nodo Jasmine?

color.js:

function Color() 
{ 

} 

colorSpec.js:

require('./color.js'); 

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

Quando eseguo jasmine-node colorSpec.js, ottengo la seguente eccezione:

ReferenceError: Color is not defined 

Come può Prendo Jasmine caricare il mio file color.js prima di eseguire colorSpec.js?

+0

Ho appena trovato questo domanda, che è simile: http://stackoverflow.com/questions/4662851/how-do-you-import-non-node-js-files – LandonSchropp

risposta

13

è possibile caricare color.js in colorSpec.js con require(). Non vedo come il gelsomino possa indovinare tutte le dipendenze senza dire a gelsomino cosa sono esattamente nel file delle specifiche. Edit: Una soluzione rapida e sporca, ma forse c'è BuiltIn qualcosa di Jasmine per farlo:

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

quindi la classe dovrebbe essere disponibile con il gelsomino

se si chiama bisogno direttamente sul vostro file penso è necessario creare un modulo ed esportarlo

+0

Ho provato ad aggiungere 'require ('./ color.js');' nella parte superiore del mio file spec ma sto ancora ottenendo eccezioni 'RefereceError'. – LandonSchropp

+0

Ho aggiornato la mia domanda con più descrizione. – LandonSchropp

+0

ho aggiornato anche la mia risposta. – mpm

5

Questo non è il modo in cui richiede funziona. Il tuo color.js deve definire/esportare qualcosa. Presumo che tu usi require.js qui per la sanità mentale.

color.js

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

Poi nelle specifiche:

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

Sinceramente non avevo intenzione di usare 'require.js'. Sto costruendo una libreria di colori e non volevo forzare alcuna dipendenza dalle persone che la usavano La tua risposta è probabilmente il modo accettato per farlo, ma non si adatta ai miei requisiti di progetto – LandonSchropp

+0

Grazie per l'aiuto però. Lo apprezzo – LandonSchropp

14

Quando si utilizza Jasmine nodo, ti consigliamo di esportare l'oggetto/funzione/classe, in questo caso a colori, come un nodo modulo. Mi piace cercare di rendere i miei moduli lavorano in entrambi nodo o un browser, in questo modo:

struttura di cartelle:

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

Grazie. Una domanda: posso omettere la logica di controllo dell'esistenza 'modulo'? Quando 'module' può essere' indefinito'? –

+1

Se non si pianifica di eseguirlo in un browser, allora sì. – b01

Problemi correlati