2014-04-06 10 views
5

Oto normalny moduł węzła. Niektóre funkcje nie zostały wyeksportowane, ale musiały zostać przetestowane:Testowanie nie wyeksportowanych metod węzła modułu

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

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

Ktoś wie, jak przetestować foo3? Normalnie testuję moduły z modułem piaskownicy. Ale istnieje tylko możliwość wyśmiewania danej rzeczy dla modułu, ale nie mogę zmienić zakresu metod.

próbki do testowania modułu z węzłów piaskownicy-module:

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

Dzięki za pomoc!

+0

Wystarczy wyeksportować również foo3, poprzedzając go z und erscore oznacza, że ​​jest to funkcja prywatna, na przykład '_foo3: foo3'. –

+0

możliwy duplikat [Jak uzyskać dostęp i przetestować funkcję wewnętrzną (nie eksportową) w module node.js?] (Http://stackoverflow.com/questions/14874208/how-to-access-and-test-an -internal-non-export-function-in-a-node-js-module) – waterproof

Odpowiedz

6

Nie można zmienić reguł zasięgu w danym języku. Ale możesz obejść to. Możesz wyeksportować zmienną środowiskową, a jeśli zmienna istnieje, możesz wyeksportować także foo3. Podoba Ci się to

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

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

tak, to testami może testować foo3, podobnie jak oni przetestować inne funkcje eksportowane. Ale w środowisku produkcyjnym od TESTING zmienna środowiskowa nie będzie dostępna, foo3 nie będzie eksportowana.

Również, używając _ w nazwie funkcji, rozumie się, że funkcja/zmienna jest do użytku wewnętrznego, żaden kod zewnętrzny nie powinien opierać się na tej funkcji/zmiennej i może podlegać zmianie bez powiadomienia.

0

Użyłem tego, wydaje się działać.

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)) 

wyjściowe

Hi Jim, double 10 = 20 
4 
Powiązane problemy