javascript - 为什么传递的函数是否带参数对 Mocha 的 `before()` 很重要?

标签 javascript node.js promise mocha.js chai

我的describe中有这样的代码:before(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();
    });
}

promise 永远不会兑现。两个观察结果:

  1. 完成! 确实(立即)正确输出
  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();
}

我不知道它的确切来源,但我不需要它,这就是为什么我只是将它放入一个虚拟变量中。

现在我怀疑这与它有关,但我想知道为什么我的解决方法在这里不起作用。

我仍然想在默认情况下使用 before(a),而 my_var 未定义。当我真的想传递那个变量时,我打算:

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

最佳答案

那是因为 Mocha 检查你传递给 before 的函数来检查有多少参数是 defined on it像这样:

 this.async = fn && fn.length;

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

请注意,Mocha 对所有其他 Hook 执行相同操作:beforeEachafter 等,以及您传递给 it 的回调.

关于javascript - 为什么传递的函数是否带参数对 Mocha 的 `before()` 很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45763306/

相关文章:

javascript - 使用 Ctrl-C 退出时,Node.js 调试器是否发送 SIGINT/SIGTERM?

javascript - 如何在 AngularJS Emit 中将函数作为参数传递?

javascript - 如何在合适的时候显示onbeforeunload dialog?

javascript - 用于使用 Node.js 模块完成代码的 WebStorm JSDoc 类声明

node.js - 当 props.match.params.id 返回未定义但 id 在 url 上可见时,如何获取 url 的 id 参数?

javascript - jQuery.when() 和 ES6 的 Promise.all() 有什么区别?

javascript - Promise 范围在执行时不同

javascript - 使用nodemailer发送电子邮件

javascript - 为什么要在 Array.prototype.forEach() 中检查 null?

javascript - 如何在循环并进行异步 promise 调用后获取重新格式化的 json 对象