2016-01-31 27 views
10

Voglio verificare che una funzione in un modulo ES6 richiami un'altra funzione che utilizza Sinon.js. Ecco il layout di base di quello che sto facendo:Verificare che una funzione richiami un'altra funzione in un modulo ES6 con Sinon.js

foo.js

export function bar() { 
baz(); 
} 

export function baz() { 
... 
} 

test.js

import sinon from 'sinon'; 
import * as Foo from '.../foo'; 

describe('bar', function() { 
    it('should call baz', function() { 
    let spy = sinon.spy(Foo, 'baz'); 
    spy.callCount.should.eql(0); 

    Foo.bar(); 

    spy.calledOnce.should.eql(true); 
    }); 
}); 

Ma la spia non risponde alla chiamata a baz(). C'è un altro modo in cui posso configurare il modulo o il test per permettere a sinon di capirlo? La mia alternativa è fare alcune asserzioni di base su qualcosa che fa baz, ma ovviamente non voglio farlo.

Da quello che ho visto online mi chiedo se questo è possibile anche con il codice presentato come-è o se ho bisogno di ristrutturarlo per ottenere quello che voglio.

risposta

12

Hai ragione nel pensare che questo non è possibile con il modo in cui il modulo è attualmente strutturato.

Quando il codice viene eseguito, il riferimento baz all'interno di function bar viene risolto rispetto all'implementazione locale. Non è possibile modificarlo poiché al di fuori del codice del modulo non è possibile accedere agli interni.

È do avere accesso alle proprietà esportate, ma non è possibile modificarle e quindi non è possibile modificare il modulo.

Un modo per cambiare la situazione sta usando il codice come questo:

let obj = {}; 
obj.bar = function() { 
this.baz(); 
} 

obj.baz = function() { 
... 
} 

export default obj; 

Ora, se si ignora baz nell'oggetto importato si sarà influenzare i meccanismi interni di bar.

Detto questo, sembra piuttosto goffo. Esistono altri metodi di controllo dei comportamenti come l'iniezione di dipendenza.

Inoltre, dovresti considerare se ti interessa effettivamente se è stato chiamato baz. Nei "test black-box" standard, non ti interessa il come si fa qualcosa, ti interessa solo quali effetti collaterali ha generato. Per questo, prova se gli effetti collaterali che ti aspettavi accadessero e che nient'altro è stato fatto.

+0

Grazie per la risposta rapida. Ho pensato tanto e ho avuto la sensazione di dover adottare un approccio più black-box. – kurtmarcink