2017-09-08 2 views
1

Ich verwende es6 Module und Karma/Mocha/Sinon/Chai für Unit-Tests. Wenn ich einen es6 Modul innerhalb eines anderen es6 Modul namens ich in der Lage bin Stummel/Spion an diesem zweiten es6 Modul, wie unten zu sehen:Sinon Stub/Spy auf lokale Funktionen in Unit-Tests

Modul-a.js

export function a() { 
    // do something 
} 

Modul-b Js

import * as moduleA from './module-a'; 

export function b() { 
    // do something 
    moduleA.a(); 
} 

Mit dem obigen Code, den ich auf moduleA.a ausspionieren() und bestimmen, wann es genannt wurde und Stub moduleA.a() und spezifische Rückgabewerte erzwingen.

ABER, wenn ich diese Situation statt, kann ich auszuspionieren oder Stummel nicht:

Modul-a.js

export function a() { 
    // do something 
} 

export function b() { 
    // do something 
    a(); 
} 

Wenn ich versuche, spionieren/Stub-Funktion a() in diesem Beispiel: Der Spion/Stub in Sinon wird nie aufgerufen./Dies ist eine ziemlich häufige Situation, also hat jemand einen Weg gefunden, die lokalen Funktionen auszuspionieren?

Danke!

Antwort

0

Ich hatte ein ähnliches Problem und ich verwende den folgenden Ansatz, wo Sie einen Standard-Export, der eine benannte Variable Wrapper aller benannten Funktion Exporte ist. Sie setzen dann Ihre intraumodul-Funktionsaufrufe mit dieser Standard-Exportobjekt-Referenz voran. In Ihrem Test importieren Sie den Standardexport und sind dann in der Lage, mit modulinternen Funktionsaufrufen zu stubben, die das stubbed-Verhalten berücksichtigen:

// MyModule.js 
let MyModule; 

export function myfunc2() { return 2; } 
export function myfunc1() { return MyModule.myfunc2(); } 

export default MyModule = { 
    myfunc1, 
    myfunc2 
} 

// tests.js 
import MyModule from './MyModule' 

describe('MyModule',() => { 
    const sandbox = sinon.sandbox.create(); 
    beforeEach(() => { 
    sandbox.stub(MyModule, 'myfunc2').returns(4); 
    }); 
    afterEach(() => { 
    sandbox.restore(); 
    }); 
    it('myfunc1 is a proxy for myfunc2',() => { 
    expect(MyModule.myfunc1()).to.eql(4); 
    }); 
});