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

Sinon.js: How to mock a object constructed with new?

我有这个代码:

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() 以便我可以控制生成的对象?

这似乎有效:

// test `success` callback
let testUser = { user : 'test' };
let stub     = sinon.stub(Parse.User.prototype, 'signUp')
                    .yieldsTo('success', testUser);

您应该能够像对任何其他函数进行存根一样对构造函数进行存根,并且只是 return 您的假对象:

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

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

虽然它丑得要死,但我已经成功地使用它进行了测试:

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,我所有的测试都是通过破解部分 proxyquire 和 sinon 一起构建的。

我需要重新阅读文档。