Javascript 单元测试调用其他方法的方法

Javascript 单元测试调用其他方法的方法,javascript,promise,mocha.js,chai,Javascript,Promise,Mocha.js,Chai,我是测试新手。我试图对一个调用其他两个方法的方法进行单元测试。我试着截取这两个方法,但看起来原始方法仍在被调用。我正在尝试测试我的方法是否将savePoll方法返回的对象添加到user.polls数组中 test.js var UserStub = sinon.stub(); var PollStub = sinon.stub(); var OptionStub = sinon.stub(); var saveOptionsStub = sinon.stub(); var savePollStu

我是测试新手。我试图对一个调用其他两个方法的方法进行单元测试。我试着截取这两个方法,但看起来原始方法仍在被调用。我正在尝试测试我的方法是否将savePoll方法返回的对象添加到user.polls数组中

test.js

var UserStub = sinon.stub();
var PollStub = sinon.stub();
var OptionStub = sinon.stub();
var saveOptionsStub = sinon.stub();
var savePollStub = sinon.stub();
var users = proxyquire('../controllers/users', {
    '../models/user': UserStub,
    '../models/poll': PollStub,
    '../models/option': OptionStub
});

  beforeEach(function() {
    res = {
        json: sinon.spy(),
        send: sinon.spy(),
        status: function(responseStatus) {
            return this;
        }
    };
    req = {
        params: {
            id: 1
        }
    };

    UserStub.save = function(callback) {
        callback(null, req.body);
    };
 });

describe('add a poll', function() {
            it('should add the poll', function() {
                req.body = {
                    name: 'Poll1',
                    options: [{
                        text: 'option1',
                        votes: 0
                    }, {
                        text: 'option2',
                        votes: 1
                    }]
                };
                var user = {};
                user.polls = [];
                UserStub.findById = function(query, callback) {
                    callback(null, user);
                };

                sinon.stub(require('../controllers/users'), 'saveOptions').returns([OptionStub, OptionStub]);
                sinon.stub(require('../controllers/users'), 'savePoll').returns({});


                users.addPoll(req, res);
                expect(user.polls).to.equal('[{}]');
            });
});
users.js

 addPoll: function(req, res) {
        var self = this;
        User.findById(req.params.user_id, function(err, user) {
            if (err) return res.status(400).json(err);

            self.saveOptions(req.body.options)
                .then(function(optionsArr) {
                    var pollName = req.body.name;
                    self.savePoll(pollName, optionsArr)
                        .then(function(poll) {
                            user.polls.push(poll);
                            user.save(function(err, user) {
                                if (err) return res.status(500).json(err);
                                res.json(poll);
                            });
                        }, function(err) {
                            return res.status(500).json(err);
                        });
                }, function(err) {
                    return res.status(400).json(err);
                });
        });
    },

    savePoll: function(pollName, optionsArr) {
        return new Promise(function(resolve, reject) {
            var poll = new Poll();
            poll.name = pollName;
            poll.options = optionsArr.slice();
            poll.save(function(err, poll) {
                if (err) {
                    reject(err);
                } else {
                    resolve(poll);
                }
            });
        });
    },
    saveOptions: function(options) {
        var optsArr = [];
        var promises = options.map(function(opt) {
            return new Promise(function(resolve, reject) {
                var option = new Option(opt);
                return option.save(function(err, option) {
                    if (err) {
                        reject(Error(err));
                    } else {
                        resolve(optsArr.push(option));
                    }
                });
            });
        });

        return Promise.all(promises).then(function() {
            return optsArr;
        }).catch(function(err) {
            console.log(err);
        });
    }

所有那些间谍都只是一个皮塔。您可以直接测试承诺代码-如果您
返回
来自
it
的承诺,它将等待它,并根据承诺是否得到解决/拒绝而失败/通过-感谢您的链接。这对测试savePoll和saveOptions方法很有帮助,但是如何确保addPoll方法中的这一行
user.polls.push(poll)
也能正常工作呢?所有这些间谍都只是一个PiTA。您可以直接测试承诺代码-如果您
返回
来自
it
的承诺,它将等待它,并根据承诺是否得到解决/拒绝而失败/通过-感谢您的链接。这对测试savePoll和saveOptions方法很有帮助,但是如何确保addPoll方法中的这一行
user.polls.push(poll)
也正常工作?