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

时间:2017-08-18 18:51:56

标签: javascript node.js promise mocha chai

我的describebefore(a)中有这样的代码。

a看起来像这样:

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

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

但是,当我a取一些输入变量时:

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已填充。
  3. 它填充了这个:

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

    我不知道确切的地方,但我不需要它,这就是为什么我把它放入虚拟变量。

    现在我怀疑它与它有关,但我想知道为什么我的解决方法在这里没有做到这一点。

    我仍然希望使用before(a)作为默认情况,保留my_var未定义。当我确实想要传递该变量时,我打算:

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

2 个答案:

答案 0 :(得分:1)

这是因为Mocha会检查您传递给before的函数,以检查defined on it这样的参数数量:

 this.async = fn && fn.length;

如果定义了任何参数,则该函数被视为异步。 (Mocha还会检查它是否返回一个promise,但这是一个不同的测试。)如果至少定义了一个参数,那么Mocha将第一个参数传递给你在before回调完成时要调用的函数工作。该回调(传统上称为done)对于不使用promises的代码很有用。 如果你不打电话,那么即使你回复了承诺,摩卡也会永远等待。

请注意,Mocha对所有其他挂钩执行相同的操作:beforeEachafter等,并将回传传递给it

答案 1 :(得分:1)

Mocha beforeafterit函数接受一个参数 - 回调。当您的测试使用异步函数时,应该定义和调用它:

db.connect是异步函数:

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

db.connect返回承诺时,您不应该使用回调并且可以返回承诺:

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

在您的代码中,您使用before函数调用a,该函数接受两个参数。 Mocha将第一个参数解释为回调,并尝试调用它。

要防止出现此问题,您需要直接调用a函数并在其中传递params:

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