Je comprends module.export
et require
mannner:
Exiger un fichier js externe pour les tests de mocha
Bien qu'il soit assez utilisable tant qu'il s'agit d'un module, je pense que cette façon est gênante puisque ce que j'ai l'intention de faire maintenant est de tester un code dans un fichier.
Par exemple, j'ai un code dans un fichier:
App.js
'use strict'; console.log('app.js is running'); var INFINITY = 'INFINITY';
Et maintenant, je veux tester ce code dans un fichier:
Test.js
var expect = require('chai').expect; require('./app.js'); describe('INFINITY', function() { it('INFINITY === "INFINITY"', function() { expect(INFINITY) .to.equal('INFINITY'); }); });
Le code de test exécute app.js
, donc la sortie est;
app.js is running
puis
ReferenceError: INFINITY is not defined
Ce n'est pas ce à quoi je m'attendais.
Je ne veux pas utiliser module.export
et écrire comme
var app = require('./app.js');
et
app.INFINITY
et app.anyOtherValue
pour chaque ligne du code de test.
Il doit y avoir une manière intelligente. Pourrais-tu me dire?
Merci.
MISE À JOUR: RÉPONSE FINALE:
Ma réponse précédente est invalide depuis eval(code);
N'est pas utile pour les variables.
Heureusement, le node
a un fort mehod – vm
Toutefois, selon le document,
Le module vm a de nombreux problèmes connus et des cas de bord. Si vous rencontrez des problèmes ou des comportements inattendus, consultez les problèmes ouverts sur GitHub. Certains des plus gros problèmes sont décrits ci-dessous.
Donc, bien que cela fonctionne à la surface, des soins supplémentaires nécessaires à un tel objectif, comme le test …
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'); }) }); });
APRÈS TOUT; La meilleure façon que j'ai trouvée dans ce cas est d'écrire le code de test de mocha dans le même fichier.
_test
habituellement un objet _test
contenant des références à toutes mes variables et fonctions internes "privées" et je les expose aux exportations. Dans ton cas:
./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'); });