2014-01-29 10 views
11

I module.export und require mannner verstehen:JavaScript-Test (Mokka) mit 'Import' js Datei

Requiring external js file for mocha testing

Obwohl es ziemlich verwendbar ist, solange es ein Modul ist, ich fühle mich diese Art und Weise ist unbequem, da, was ich beabsichtigt jetzt, einen Code in einer Datei zu testen.

Zum Beispiel, ich habe einen Code in einer Datei:

app.js

'use strict'; 
console.log('app.js is running'); 
var INFINITY = 'INFINITY'; 

und jetzt möchte ich in einer Datei diesen Code testen:

Test .js

var expect = require('chai').expect; 

require('./app.js'); 


    describe('INFINITY', function() 
    { 
     it('INFINITY === "INFINITY"', 
      function() 
      { 
       expect(INFINITY) 
        .to.equal('INFINITY'); 
      }); 
    }); 

Der Testcode wird ausgeführt app.js, also ist der Ausgang;

app.js is running

dann

ReferenceError: INFINITY is not defined

Das ist nicht das, was ich erwartet hatte.

Ich will nicht module.export verwenden und wie

var app = require('./app.js');

und

app.INFINITY und app.anyOtherValue für jede Zeile in dem Testcode zu schreiben.

Es muss einen klugen Weg geben. Kannst du es mir sagen?

Danke.

Antwort

13

UPDATE: FINAL ANTWORT:

Meine vorherige Antwort ist Inva Deckel seit eval(code); ist nicht nützlich für Variablen.

Glücklicherweise hat eine starke node mehod - vm

http://nodejs.org/api/vm.html

jedoch gemäß der doc,

vm Das Modul viele bekannte Probleme und Grenzfälle hat. Wenn Probleme oder unerwartetes Verhalten auftreten, sehen Sie sich die offenen Fragen auf GitHub an. Einige der größten Probleme werden im Folgenden beschrieben.

so, obwohl dies funktioniert auf der Oberfläche, zusätzliche Pflege benötigt für einen solchen Zweck wie Tests ...

var expect = require('chai') 
    .expect; 

var fs = require('fs'); 
var vm = require('vm'); 
var path = './app.js'; 

var code = fs.readFileSync(path); 
vm.runInThisContext(code); 

describe('SpaceTime', function() 
{ 
    describe('brabra', function() 
    { 
     it('MEMORY === "MEMORY"', 
      function() 
      { 
       expect(MEMORY) 
        .to.equal('MEMORY'); 
      }) 
    }); 

}); 

AFTER ALL; Der beste Weg, den ich in diesem Fall fand, ist , um den Test-Mocha-Code in die gleiche Datei zu schreiben.

4

Ich schließe normalerweise ein _test Objekt ein, das Verweise auf alle meine "privaten" internen Variablen und Funktionen enthält und es beim Export verfügbar macht. In Ihrem Fall:

./app.js

var INFINITY = 'infinity'; 

function foo() { 
    return 'bar'; 
} 

exports._test = { 
    INFINITY: INFINITY, 
    foo: foo 
} 

./test/app-test.js

var app = require('../app.js') 
/* ... */ 
it('should equal bar', function() { 
    expect(app._test.foo()).to.equal('bar'); 
}); 
it('should equal infinity', function() { 
    expect(app._test.INFINITY).to.equal('infinity'); 
}); 
+0

Danke. Ich verstehe deine Antwort. Ich würde nach einer Lösung suchen, die ohne Änderungen am Testcode getestet werden kann, und ohne ein Präfixobjekt, um es zu verweisen. –

+0

danke. Ich behebe dieses Problem, und wenn das erledigt ist, werde ich die Lösung posten, also bleibt dran! –

+0

Ich fand die Lösung, überprüfe meine Antwort. –