为什么Mocha的`before()`函数传递是否带参数?

在我的describe有这样的代码: before(a)

当看起来像这样:

 function a() { return chai.request(app) ... .then(res => { res.blah.should.blah; return Promise.resolve(); }); } 

…一切都很好(这是一个非常快的电话)。

但是,当我做ainputvariables:

 function a(dummy, my_var) { return chai.request(app) ... // use my_var here .then(res => { res.blah.should.blah; console.log("finished!"); return Promise.resolve(); }); } 

承诺永远不会解决。 两点意见:

  1. finished! 确实得到正确的输出(立即)
  2. dummy填充。

这是填充这个:

 function (err) { if (err instanceof Error || toString.call(err) === '[object Error]') { return done(err); } if (err) { if (Object.prototype.toString.call(err) === '[object Object]') { return done(new Error('done() invoked with non-Error: ' + JSON.stringify(err))); } return done(new Error('done() invoked with non-Error: ' + err)); } if (result && utils.isPromise(result)) { return done(new Error('Resolution method is overspecified. Specify a callback *or* return a Promise; not both.')); } done(); } 

我不知道从哪里来,但我不需要它,这就是为什么我把它放到一个虚拟variables。

现在我怀疑这跟它有关系,但是我想知道为什么我的解决方法在这里没有办法。

我仍然希望before(a)使用默认情况, my_var未定义。 当我真的想要通过这个variables时,我打算:

 before(() => { return a('my_content'); }) 

这是因为Mocha会检查您before传递给您的函数before以检查其中定义了多less个参数:

  this.async = fn && fn.length; 

如果定义了任何参数,则该函数被认为是asynchronous的。 (Mocha也会检查它是否返回一个promise,但这是一个不同的testing。)如果至less定义了一个参数,那么Mocha将作为第一个parameter passing一个函数,当你beforecallback完成它的工作时,你需要调用这个函数。 该callback(传统上称为“ done )对于不使用承诺的代码非常有用。 如果你不这么称呼,那么即使你答应答复,摩卡也会永远等待。

请注意,Mocha与其他所有钩子都是一样的: beforeEachafter ,等等,以及传递给it的callbackbeforeEach

摩卡beforeafteritfunction接受一个参数 – callback。 应该在testing使用asynchronous函数时定义和调用:

db.connect是asynchronous函数:

 before(done => { db.connect(done); } 

db.connect返回一个promise时,你不应该使用callback,并且可以返回promise:

 before(() => { return db.connect(); } 

在你的代码中,你可以使用a函数来调用,它接受两个参数。 摩卡将第一个参数解释为callback,并试图调用它。

为了防止这个问题,你需要直接调用a函数,并在其中传递参数:

 before(() => { return a(dummy, my_var); }