2016-03-02 17 views
7

Nie mogę znaleźć sposobu na wywołanie funkcji wywoływanej z tego samego modułu, dla której zdefiniowano tę funkcję (kod pośredniczący nie działa). Oto przykład:Funkcja modułu zwanego wywołanego z tego samego modułu

myModule.js:

'use strict' 

function foo() { 
    return 'foo' 
} 

exports.foo = foo 

function bar() { 
    return foo() 
} 

exports.bar = bar 

myModule.test.js:

'use strict' 

const chai = require('chai') 
const sinon = require('sinon') 

chai.should() 

const myModule = require('./myModule') 

describe('myModule',() => { 
    describe('bar',() => { 
    it('should return foo',() => { 
     myModule.bar().should.equal('foo') // succeeds 
    }) 

    describe('when stubbed',() => { 
     before(() => { 
     sinon.stub(myModule, 'foo').returns('foo2') // this stub seems ignored 
     }) 

     it('should return foo2',() => { 
     myModule.bar().should.equal('foo2') // fails 
     }) 
    }) 
    }) 
}) 

Przypomina mi Java statycznych funkcji, które nie są stubbable (prawie).

Każdy pomysł, jak osiągnąć to, co próbuję zrobić? Wiem, że wyodrębnianie foo w innym module będzie działało, ale to nie jest to, co próbuję tutaj zrobić. Jestem również świadomy, że wywołanie metody foo w metodzie bar ze słowem kluczowym this również zadziała, jestem zaintrygowany użyciem w tym kontekście this (ponieważ nie używam OOP).

Odpowiedz

7

Właśnie to przetestowałem. I działa jak urok.

'use strict' 

function foo() { 
    return 'foo'; 
} 

exports.foo = foo; 

function bar() { 
    return exports.foo(); 
} 

exports.bar = bar; 

Wyjaśnienie

kiedy robisz sinon.stub(myModule, 'foo').returns('foo2') następnie sinon odcinki w exported obiektu foo nie faktycznie foo funkcja od wewnątrz myModule.js ... a trzeba wiedzieć, foo jest dostępny z zewnątrz moduł. Dlatego po ustawieniu exports.foo wyeksportowany obiekt exports.foo przechowuje wartość ref foo. i kiedy dzwonisz sinon.stub(myModule, 'foo').returns('foo2'), sinon będzie skrótową exports.foo a nie rzeczywista foo

Nadzieja to ma sens!

+0

Świetnie, dzięki. Wciąż trochę brzydko używać "eksportu", ponieważ działa tak samo jak "to", ale to wystarczy. Używanie 'this' w statycznym kontekście wprawiało mnie w zakłopotanie. – Simon

+0

Witaj, mój przyjacielu! –

+0

Co zrobić, jeśli nie możesz zmienić kodu źródłowego? – nbkhope

Powiązane problemy