【发布时间】:2018-03-29 17:28:30
【问题描述】:
我正在尝试使用 Mocha、Chai 和 Sinon 向我的代码添加更多测试,但是我很难理解为什么第二个存根函数未被识别为被调用。
我有一个向用户发送电子邮件的功能(稍后我将测试电子邮件功能 - 现在我只想处理我控制的存根依赖项)
// 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');
}
}
}
还有一个测试文件:
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: 'testemail@eml.co'
};
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
})
})
});
我可以用 Sinon 存根 User.findOne() 方法,但是当我尝试存根 emailLogger.log() 方法时,我遇到了麻烦。它似乎调用了存根而不是真正的方法,但 expect(emailLogger.log).to.have.been.calledOnce 返回 false。
我尝试添加done() 和一个假计时器以防出现延迟问题,以及一系列其他事情,但到目前为止没有运气。
【问题讨论】:
标签: javascript node.js unit-testing mocha.js sinon