我正在尝试在回调中测试一些逻辑而不连接数据库。为此,我需要存根模型的save方法。但是,我仍然需要检查作为逻辑的一部分而改变的模型值。
逻辑:
// check if user exists with facebook or google account
User.findOne({ $or: [{'facebook.email': email}, {'google.email': email}] }, function(err, user) {
if (err) return cb(err);
else {
// create new user
if (!user) {
user = new User();
}
// add the local account
user.local.email = email; // <--
user.local.password = User.generateHash(password);
// create a new token for the local account
user.local.token = User.createAccessToken(email);
// save
user.save(function(err, user) {
if (err) cb(err);
return cb(false, user); // <-- HOW DO I TEST that user.local.email == email inside this callback?
});
}
});
我的测试看起来像这样:
it('should create new user if email not in database', function(done) {
var email = 'test@test.com';
sinon.stub(User, 'findOne').yields(false, null);
sinon.stub(User.prototype, 'save') // <-- how to stub this correctly?
userService.localSignup(email, '123123', function(err, user) {
assert.instanceOf(user, User);
assert.equal(user.local.email, email);
assert.isNotNull(user.local.password);
return done();
});
});
也许这些嵌套的回调是一种糟糕的模式?