Sinon.js与猫鼬和蓝鸟

时间:2016-03-28 19:03:41

标签: node.js mongoose mocha bluebird sinon

我有一个使用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的正确方法?

谢谢!

0 个答案:

没有答案