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 一起构建的。
我需要重新阅读文档。
我有这个代码:
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 一起构建的。
我需要重新阅读文档。