我有一个使用promisified Mongoose查询的辅助函数。我对使用Sinon.js测试相当新,并且无法弄清楚如何测试使用蓝鸟Promise的Mongoose。
这是我的功能:
module.exports = function addParticipant(session, user) {
Session.Promise = Promise;
return Session
.findById(session._id)
.populate('location')
.populate('participants)
.then((session) => {
const participant = new Participant({
user: user._id,
session: session.id
});
return participant.save((err) => {
if (err) {
Promise.reject(err);
}
session.participants.push(participant);
session.save((err) => {
if (err) {
Promise.reject(err);
}
notifications.notifyLearner(notifications.LEARNER_REGISTERED, {
session,
user
});
Promise.resolve(participant);
});
});
});
};
我想测试学生通知是否已被调用,这就是我所拥有的,但我无法弄清楚如何模拟我的承诺链的then
部分。
describe('helpers', () => {
describe('addParticipant', () => {
let SessionMock;
beforeEach(() => {
SessionMock = {
populate: sinon.spy(() => SessionMock)
};
sinon.stub(Session, 'findById', () => SessionMock);
sinon.stub(Session.prototype, 'save', (cb) => cb(null));
sinon.stub(Participant.prototype, 'save', (cb) => cb(null));
sinon.stub(notifications, 'notifyLearner');
});
afterEach(() => {
Session.findById.restore();
Session.prototype.save.restore();
Participant.prototype.save.restore();
notifications.notifyLearner.restore();
});
describe('add participant to session', () => {
let testSession;
let testUser;
let addParticipantPromise;
beforeEach(() => {
testUser = new User({
_id: new mongoose.Types.ObjectId
});
testSession = new Session({
_id: new mongoose.Types.ObjectId,
participants: []
});
// Probably not the best way to do this.
SessionMock.then = sinon.spy((cb) => {
cb(testSession);
});
addParticipantPromise = addParticipant(testSession, testUser);
});
it.only('should notify Learner', () => {
return addParticipantPromise.then(() => {
notifications.notifyLearner.should.be.called();
});
});
});
});
});
我可以将testSession
传递给then
函数,但我的承诺无法解决任何问题。
我该如何测试?什么是间谍/捣乱/嘲笑Promise的正确方法?
谢谢!