2017-10-17 1 views
0

Ich versuche, meinen Code mit Mocha, Chai und Sinon mehr Tests hinzufügen, aber ich habe Mühe zu verstehen, warum diese zweite Stub-Funktion nicht als aufgerufen erkannt wird.Sinon Stub nicht nach dem Versprechen zurückgerufen

Ich habe eine Funktion, die eine E-Mail an einen Benutzer sendet (Ich werde die E-Mail-Funktionalität später testen - jetzt will ich nur einen Griff bekommen auf Abhängigkeiten Anstoßen, die ich kontrollieren)

// EmailSender.js 
const models = require('../models'); 
const User = models.user; 
const emailLogger = require('./emailLogger'); 

class EmailSender { 
    constructor(subject, emailData) { 
    this.subject = subject; 
    this.emailData = emailData; 
    } 

    sendToUser() { 
    let email = this.emailData.email; 

    User.findOne({ where: { $or: [ 
     { email: email }, 
     { workEmail: email }, 
    ] } }) 
    .then(function (userData) { 
     if (userData) { 
     emailLogger.log('Send to anon - sending to user ' + userData.id); 
     }); 
    } else { 
     emailLogger.log('Send to anon - no user found'); 
    } 
    } 
} 

Und ein Testdatei:

const EmailSender = require('../../../helpers/emailSender'); 
const models = require('../../../models'); 
const User = models.user; 
const emailLogger = require('../../../helpers/emailLogger'); 
const chai = require("chai"); 
const sinon = require('sinon'); 
const sinonChai = require("sinon-chai"); 

const expect = chai.expect; 
chai.use(sinonChai); 

describe('The emailSender',() => { 
    let emailData; 

    beforeEach(() => { 
    emailData = { 
     email: '[email protected]' 
    }; 
    sinon.stub(User, 'findOne').returns(Promise.resolve()); 
    sinon.stub(emailLogger, 'log'); 
    }) 

    afterEach(() => { 
    User.findOne.restore(); 
    emailLogger.log.restore(); 
    }) 

    describe('sendToUser method',() => { 
    it('logs an email if a user is found',() => { 
     let emailSender = new EmailSender('Email subject', emailData); 
     emailSender.sendToUser(); 

     expect(User.findOne).to.have.been.calledOnce; // works 
     expect(emailLogger.log).to.have.been.calledOnce; // doesn't 
    }) 
    }) 
}); 

kann ich die User.findOne() -Methode mit Sinon Stummel, aber wenn ich die emailLogger.log() Methode, die ich in Schwierigkeiten geraten, versuchen und Stummel. Es scheint, den Stub und nicht die echte Methode aufzurufen, aber expect(emailLogger.log).to.have.been.calledOnce gibt false zurück.

Ich habe versucht, done() und einen falschen Timer für den Fall, dass es eine Verzögerung gab, sowie eine Reihe anderer Dinge, aber bisher kein Glück.

Antwort

0

Ein großer Trick besteht darin, das Versprechen von der Testfunktion zurückzugeben, die bewirkt, dass Mocha wartet, bis das Versprechen abgeschlossen ist. Hier ist, wie Sie das tun würden:

it('logs an email if a user is found',() => { 
    const emailSender = new EmailSender('Email subject', emailData); 
    return emailSender.sendToUser().then(() => { 
     //check after the sendToUser promise is complete, but before the test is done 
     expect(User.findOne).to.have.been.calledOnce; 
     expect(emailLogger.log).to.have.been.calledOnce; 
    }); 
}); 

Dies hat den zusätzlichen Vorteil, dass, wenn das Versprechen aus irgendeinem Grunde ausfällt, wird der Test nicht zu (mit dem richtigen Fehler).

Verwandte Themen