摩卡认为解决方法已过度指定.指定回调*或*返回承诺;不能两者兼而有之



这是我加入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和选项。

知道为什么它会失败吗?

谢谢

我的测试失败了,因为它认为 User.findOneAndUpdate 方法已过度指定。

其实不然。它说"解决方法"(即您的代码告诉摩卡异步测试完成的方式(已过度指定。

您正在使用回调并返回承诺,因此摩卡无法判断您的测试何时完成以及是否可以。

您需要使用 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);
    })
  });
})

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();
    })
  });
})

最新更新