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.