Sinon.js:如何模拟用new构造的对象?

时间:2016-07-11 15:06:40

标签: javascript node.js unit-testing sinon

我有这段代码:

var async = require('async'),
    util = require('util');

var Parse = require('parse/node');

function signup(userInfo, callback) {
    var username = userInfo.username,
        email = userInfo.email,
        password = userInfo.password;

    var user = new Parse.User();
    user.set('username', username);
    user.set('email', email);
    user.set('password', password);

    user.signUp(null, {
        success: (user) => {
            // console.log('BaaS Signup success ' + util.inspect(user));
            callback(null, user);
        },
        error: (user, error) => {
            // console.log('BaaS Signup error ' + util.inspect(error));
            callback(JSON.stringify(error));
        }
    });
}

我想对它进行单元测试,因此需要能够测试成功和错误函数的内容。

如果用户是一个库,我可以使用proxyquire并将一个存根返回一个承诺并完成它,但是,构建了用户。

如何存根Parse.User()以便我可以控制生成的对象?

3 个答案:

答案 0 :(得分:1)

这似乎有效:

lapply(names(mylist), function(nm)
     save.dta13(mylist[[nm]], paste0(nm, ".dta")))

答案 1 :(得分:1)

你应该能够像对待任何其他功能那样存根构造函数,然后只返回你的虚假对象:

sinon.stub(Parse, "User")
    .andReturn(fakeUser);

let u = new Parse.User();
//u === fakeUser

答案 2 :(得分:0)

虽然它很难看,但我已经成功地完成了我的测试工作:

var chai = require('chai'),
    expect = chai.expect,
    util = require('util');

var proxyquire =  require('proxyquire').noPreserveCache();
var sinon = require('sinon');


describe('SignUp', () => {
        it('Expect to sign up the user and return the user', (done) => {
            var stub = {
                    parse: {
                        User: function User() {
                            this.set = () => {};
                            this.signUp = (a, c) => {
                                c.success({id: 'UserID'});
                            };
                        }
                    }
                },
                baas = proxyquire('./../baas.js', {
                    'parse/node': stub.parse
                });

            baas.signup({
                username: 'User',
                email: 'user@test.com',
                password: 'Password'
            }, (err, user) => {
                try {
                    expect(err).to.not.be.ok;
                    expect(user).to.be.ok;
                    done();
                } catch(err) {
                    done(err);
                }
            });
        });
});

我收到的回答让我意识到我不会像我应该那样使用sinon,而我所有的测试都是通过黑客攻击部分内容和sinon来建立的。

我需要重新阅读文档。