这是我与TDD的第一天。
var mongoose = require("mongoose"),
should = require('should'),
User = require("app/models/user");
mongoose.connect('mongodb://localhost/altor-security');
describe('user data', function() {
it('password should be different after changing password', function(done) {
var old_password_hash,
new_password = "12345678";
return User.findOne({ email: "example@gmail.com" }).exec()
.then(function(user) {
old_password_hash = user.password;
return User.findOneAndUpdate({ _id : user._id }, { password: new_password }, { new: true }).exec();
})
.then(function(user) {
user.password.should.not.equal(old_password_hash);
done();
})
.catch(function(err) {
err.should.equal(null);
done();
})
});
})
我的测试失败,因为它认为User.findOneAndUpdate方法已被指定。但它确实需要三个参数,findCommand,update和options。
为什么它失败了?
由于
答案 0 :(得分:2)
我的测试失败,因为它认为User.findOneAndUpdate方法已被指定。
实际上,没有。它说“解决方法”(即代码告诉mocha异步测试的方式已经完成)已经过度指定。
你正在使用回调并返回一个Promise,所以mocha无法判断你的测试何时完成以及是否正常。
您需要使用done
或返回承诺。不是两个。
优先方式(返回承诺)
describe('user data', function() {
it('password should be different after changing password', function(/*do not use done*/) {
var old_password_hash,
new_password = "12345678";
// return a Promise
return User.findOne({ email: "example@gmail.com" }).exec()
.then(function(user) {
old_password_hash = user.password;
return User.findOneAndUpdate({ _id : user._id }, { password: new_password }, { new: true }).exec();
})
.then(function(user) {
user.password.should.not.equal(old_password_hash);
})
});
})
OR
describe('user data', function(done) {
it('password should be different after changing password', function(done) {
var old_password_hash,
new_password = "12345678";
// do not return anything
User.findOne({ email: "example@gmail.com" }).exec()
.then(function(user) {
old_password_hash = user.password;
return User.findOneAndUpdate({ _id : user._id }, { password: new_password }, { new: true }).exec();
})
.then(function(user) {
user.password.should.not.equal(old_password_hash);
done();
})
.catch(function(err) {
err.should.equal(null);
done();
})
});
})