2017-12-13 7 views
0

Wenn eine Datei mit folgendem Inhalt erstellenSinon Anstoßen nicht auf module.exports

const validateEmail = email => { 
    sendEmail(email); 
}; 

const sendEmail = email => { 
    return true; 
}; 

module.exports = { 
    validateEmail, 
    sendEmail, 
}; 

Und ein Test, der die zweite Funktion zu Stub versucht ...

it('Should call sendEmail if a valid email is passed',() => { 
    let sendEmailSpy = sinon.stub(checkEmail, 'sendEmail'); 
    checkEmail.validateEmail('[email protected]'); 
    assert.isTrue(sendEmailSpy.called); 
}); 

Es ruft immer noch die sendEmail Funktion und der Test fehlschlägt

Allerdings, wenn ich die module.exports so schreiben:

module.exports = { 
    validateEmail(email) { 
     this.sendEmail(email); 
    }, 
    sendEmail(email) { 
    return true; 
    }, 
}; 

Es stubs es richtig ... Warum?

Antwort

0

Kurze Antwort - Kontext

Lange Antwort - im ersten Szenario, das exportierte sendEmail Funktion ist nicht die gleiche wie die interne eine, die von validateEmail verwendet wird. Die exportierte Funktion wird zu einer neuen Eigenschaft des Objekts, das exportiert wird, und verweist einfach auf das interne Objekt.

Im zweiten Szenario, Sie verweisen ausdrücklich auf die sendEmail Funktion auf das exportierte Objekt (das heißt this.sendEmail(...)) von validateEmail deshalb wird es die gekürzte Version.

Moral der Geschichte - Sie können nicht etwas stümpfen, das Sie nicht sehen können.

+0

Riiight ok. Gibt es eine Möglichkeit, das erste Szenario zu verwenden? – OmisNomis

+0

@OmisNomis basiert nicht auf Ihrer aktuellen Implementierung Nein, es muss extern zugänglich sein, um es stub. Was ist los mit dem zweiten Ansatz? – James

+0

nichts. Ich war nur fasziniert :-) – OmisNomis