2016-03-02 17 views
7

Bu işlevin tanımlandığı aynı modül içinde çağrılan bir işlevi saptamanın bir yolunu anlayamıyorum (saplama çalışmıyor gibi görünüyor). İşte bir örnek:Aynı modülden çağrılan Stub modül işlevi

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

Bu (neredeyse) stubbable değildir Java statik fonksiyonlar hatırlatıyor.

Yapmaya çalıştığım şeyi nasıl elde edeceğime dair bir fikriniz var mı? Farklı bir modülde foo çıkarımı çalışacağını biliyorum, ama burada yapmaya çalıştığım şey bu değil. Ayrıca, this anahtar kelimesiyle bar yönteminde foo yöntemini çağırmanın da işe yarayacağını biliyorum, bu bağlamda O this kullanımına doğru şaşkınım (OOP kullanmıyorum).

cevap

7

Sadece bunu test ettim. Ve çekicilik gibi çalışır.

'use strict' 

function foo() { 
    return 'foo'; 
} 

exports.foo = foo; 

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

exports.bar = bar; 

Açıklama

bildiğini gerektiği gibi sinon.stub(myModule, 'foo').returns('foo2') ardından myModule.js ... içeriden sinon koçanları exported nesnenin foo aslında foo fonksiyonu foo dışarıdan erişilebilir olduğu ne zaman modül. exports.foo'u ayarladığınızda, dışa aktarılan nesne exports.foo, foo ref değerini depolar. Eğer sinon.stub(myModule, 'foo').returns('foo2') çağırdığınızda ve sinonexports.foo saplama değil gerçek foo

Umut bu mantıklı olacak!

+0

Harika, teşekkürler. “Export” kelimesini kullanmak biraz çirkin, çünkü “bu” ile aynı işi yapıyor ama bunu yapacak. Statik bir bağlamda 'bunu 'kullanmak aklımı biraz karıştırdı. – Simon

+0

En çok hoşgeldin dostum! –

+0

Kaynak kodunuzu değiştiremezseniz ne olur? – nbkhope

İlgili konular