2014-04-06 13 views
5

Ecco un modulo nodo normale. Con alcune funzioni che non sono tutte esportate, ma hanno bisogno di testareTest dei metodi di nodo non esportati di un modulo

var foo1 = function() { console.log("Foo1"); } 
var foo2 = function() { console.log("Foo2"); } 
var foo3 = function() { console.log("Foo3"); } 

module.exports = { 
    foo1: foo1, 
    foo2: foo2 
} 

Qualcuno sa come testare foo3? Normalmente collaudo i moduli con il modulo node-sandboxed. Ma c'è solo la possibilità di prendere in giro cose date per il modulo, ma non posso cambiare l'ambito dei metodi.

esempio per il modulo di test con il nodo-sandbox-modulo:

var SandboxedModule = require('sandboxed-module'); 
var user = SandboxedModule.require('./user', { 
    requires: {'mysql': {fake: 'mysql module'}}, 
    globals: {myGlobal: 'variable'}, 
    locals: {myLocal: 'other variable'}, 
}); 

Grazie per l'aiuto!

+0

Basta anche esportare foo3, prefisso con un und erscore indica che si tratta di una funzione privata, ad esempio '_foo3: foo3'. –

+0

possibile duplicato di [Come accedere e testare una funzione interna (non esportazioni) in un modulo node.js?] (Http://stackoverflow.com/questions/14874208/how-to-access-and-test-an -Internal-non-esportazioni-funzione-in-a-nodo-js-modulo) – waterproof

risposta

6

Non è possibile modificare le regole di ambito della lingua. Ma puoi aggirare questo. È possibile esportare una variabile di ambiente e, se la variabile esiste, è possibile esportare anche foo3. Ti piace questa

module.exports = { 
    foo1: foo1, 
    foo2: foo2 
} 

if (process.env.TESTING) { 
    module.exports.foo3 = foo3; 
} 

Quindi, i casi di test possono testare foo3, proprio come testare altre funzioni esportate. Ma, nell'ambiente di produzione, dal momento che la variabile di ambiente TESTING non sarà presente, foo3 non verrà esportata.

Inoltre, utilizzando _ nel nome della funzione si intende che, la funzione/variabile è per uso interno, nessun codice esterno dovrebbe fare affidamento su tale funzione/variabile ed è soggetto a modifiche senza preavviso.

0

Ho usato questo, sembra funzionare.

sample.js

function double(p2) { 
    return p2*2 
} 

module.exports = function(p, p2) { 
return "Hi "+p+", double "+p2+" = "+double(p2) 
} 

sample_test.js

function load(file_name) { 
    global.module = {} 
    const contents = require('fs').readFileSync(file_name, 'utf8'); 
    const vm = require('vm') 
    new vm.Script(contents).runInThisContext(); 
} 


load("./sample.js") 

console.log(global.module.exports("Jim","10")) 
console.log(double(2)) 

uscita

Hi Jim, double 10 = 20 
4 
Problemi correlati