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

时间:2016-01-04 16:36:16

标签: javascript promise mocha chai

我是新手测试。我试图对一个调用另外两种方法的方法进行单元测试。我尝试将这两种方法存根,但看起来原始方法仍然被调用。我试图测试我的方法是否将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);
        });
    }

0 个答案:

没有答案