【问题标题】:For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves对于异步测试和钩子,确保调用了“done()”;如果返回一个 Promise,确保它解决
【发布时间】:2017-10-24 05:59:57
【问题描述】:

我在测试时对 nodejs 进行了此测试,但出现未声明完成函数的错误。

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

我的测试代码是,我已经完成回调,但仍然收到错误调用done();

    it('remove existing subdocument', (done) => {
    const Vic = new User({
      name: 'Vic',
      posts: [{ title: 'Leaning Nodejs' }]
    });

    vic.save()
      .then(() => User.findOne({ name: 'Vic' }))
      .then((user) => {
        const post = user.posts[0];
        post.remove();
        return user.save();
      })
      .then(() => User.findOne({ name: 'Vic' }))
      .then((user) => {
        assert(user.posts.length === 0);
        done();
      });
  });

【问题讨论】:

  • @MFAL,现在是死链接。这篇文章可以在其他地方找到吗?

标签: node.js mocha.js


【解决方案1】:

如果测试时间长于您设置的时间,您将不断收到错误,更新 package.json 文件,使用 ( 添加第二个测试 --no-timeout 属性解决了我的问题。

“脚本”:{

"test": "cross-env PORT=8000 mocha --watch",
"test": "cross-env PORT=8000 mocha --watch --no-timeout"*,

【讨论】:

    【解决方案2】:

    您也可以在beforebeforEach 中添加超时。

    describe('new loading express', function () {
    
      before(function () {
        this.timeout(20000); // 20 second timeout for setup
      });
    
    });
    
    

    【讨论】:

      【解决方案3】:

      我有同样的问题。我的代码中有一个before。修复它所需要的只是将this.timeout(0); 添加为before 函数的第一行,并在整个文件中使用async-await 并删除done()

      【讨论】:

        【解决方案4】:

        来自 Mocha 官方页面 (Mocha page)-> 启动 mocha 时使用 next 标志:

        --超时,-t v6.0.0 中的更新:使用检查标志调用 Mocha 时隐含 --no-timeout。它相当于 --timeout 0。不再需要 --timeout 99999999。

        指定测试用例超时,默认为两 (2) 秒(2000 毫秒)。超过此时间的测试将被标记为失败。

        要覆盖,您可以以毫秒为单位传递超时,或者带​​有 s 后缀的值,例如 --timeout 2s 和 --timeout 2000 是等效的。

        要禁用超时,请使用 --no-timeout。

        注意:同步(阻塞)测试也受超时限制,但在代码停止阻塞之前它们不会完成。无限循环仍然是无限循环!

        【讨论】:

          【解决方案5】:

          我有同样的错误信息,在我的情况下是因为使用了sinon.useFakeTimers()

          该调用与我的代码中使用的setTimeout() 冲突。删除后一切正常。

          【讨论】:

          • 对我来说,它只能通过从项目依赖项中删除 sinon 来工作。看来诗乃正在破坏一些计时器。 (我没有使用 sinon 所以这就是我删除它的原因)。
          【解决方案6】:

          你可以合作

          • 异步等待,
          • return Promise-then,
          • 函数(完成)-完成()

          在每种情况下都有超时

          • 全局超时,可以通过下面给出的命令参数给出

          • 函数超时(before/after[each|all], it)作为链方法或参数给出

            /usr/bin/node ./node_modules/mocha/bin/_mocha -u bdd --colors /home/cemt/cli-js/test/**/*.spec.js

          测试代码:

          describe('NSSF', function () {
          
              var a = 0
          
              beforeAll(async function () {
                  console.log(">>> 1. a: ", a);
                  await new Promise((resolve, reject) => {
                      var intt = setInterval(() => {
                          console.log(">>> a: ", ++a);
                          if (a == 10) {
                              clearInterval(intt)
                              resolve();
                          }
                      }, 800);
                  });
              }, 12000);
          
              it('a should be set to 1', () => {
                  console.log("-----1");
                  return new Promise(resolve => {
                      console.log("-----2");
                      setTimeout(() => {
                          resolve(1)
                      }, 14000)
                  }).then(a => {
                      expect(a === 1);
                  })
              }, 3000);
          })
          

          无超时设置:

          有超时设置:

          /usr/bin/node ./node_modules/mocha/bin/_mocha --slow 5000 -u bdd --timeout 10000 --colors /home/cemt/cli-js/test/**/*.spec.js
          

          VS Code 中的 Launch.json

          【讨论】:

            【解决方案7】:

            我的问题是超时本身(延长它没有帮助)所以我的解决方案是

            it("it should test methods",function(){
                 this.timeout(0);
               });
            

            如您所见,您不需要 done 参数

            【讨论】:

              【解决方案8】:

              @Simon Boudrias 在这里Why am I getting "Error: Resolution method is overspecified"? 的回答对我有用。我只是错过了await Promise.resolve(),我最初认为通过调用after(async () => driver && driver.quit()); 会清理所有内容并正确存在。当然,不要忘记将 .timeout(10000); 设置为您需要的任何时间,以便在您需要超过默认的 2000 来运行测试时得到保障。

              【讨论】:

                【解决方案9】:

                我遇到了同样的错误,实际上是因为我通过了 done 并调用了 done。所以删除 done 使测试通过。我正在测试的路由中调用async 函数

                【讨论】:

                  【解决方案10】:

                  我知道一种丑陋的做法,只需将 Mocha 的默认超时时间从 2 秒增加到 10 秒,这可以通过添加标志 --timeout 10000 来完成在测试脚本中,即 -

                  package.json

                   "scripts": {
                      "start": "SET NODE_ENV=dev && node server.js",
                      "test": "mocha --timeout 10000"
                    }
                  

                  【讨论】:

                  • 这个对我有用,我没有更改任何代码,我的测试突然开始无缘无故地失败。与昨天相比,我的机器可能刚刚变慢了?
                  • 此解决方案适用于本地测试,但是当我在 Travis.ci 上进行测试时,测试失败。第一个答案是测试在本地和 Travis.ci 上都取得了成功
                  【解决方案11】:

                  如果你在VS Code扩展开发中遇到这个错误,需要在src/test/suite/index.ts中的Mocha实例中添加timeout,例如:

                  // Create the mocha test
                  const mocha = new Mocha({
                      ui: 'tdd',
                      color: true,
                      timeout: 10000 // Your application ideal timeout here
                  });
                  

                  【讨论】:

                    【解决方案12】:

                    如果以上都没有帮助,请尝试摆脱“完成”并改用异步函数()

                    it("Test Post Request", async function () {
                        _code_
                    })
                    

                    【讨论】:

                      【解决方案13】:

                      package.json 文件中 您可以使用 --timeout 15000 修复此错误,
                      就像我在下面使用的一样。

                      "scripts": {
                        "start": "node server/server.js",
                        "test": "export NODE_ENV=test || SET \"NODE_ENV=test\" && mocha --timeout 15000 server/**/*.test.js",
                        "test-watch": "nodemon --exec 'npm test'"
                      }
                      

                      这个错误是因为mocha。

                      【讨论】:

                      • 看起来你使用的是 15000,而不是 1500
                      【解决方案14】:

                      我也遇到了这个错误,经过几个小时的研究和调试,我找到了根本原因。

                      考虑这个测试:

                      const delay = require('delay')
                      
                      describe('Test', function() {
                          it('should resolve', async function(done) {
                            await delay(1000)
                          })
                      })
                      

                      当我运行测试时,我得到这个错误:

                      Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
                      

                      现在考虑这个稍微不同的测试,其中 done 参数被删除

                      const delay = require('delay')
                      
                      describe('Test', function() {
                          it('should resolve', async function() {
                            await delay(1000)
                          })
                      })
                      

                      当我运行这个测试时,它通过了。

                      异步函数中存在的 done 参数以某种方式破坏了测试,即使它没有被使用,即使 done() 在结束时被调用测试。

                      使用摩卡版本7.2.0

                      【讨论】:

                      【解决方案15】:

                      当我回来维护一个从 Node6 到 Node 13 的旧节点模块时,我很高兴。修复很简单:

                      • 在测试文件夹下添加一个文件mocha.opts
                      • 这个文件的内容是一行:--timeout 10000

                      【讨论】:

                        【解决方案16】:

                        您可以将超时添加到特定测试以增加/覆盖默认超时,即 2 秒。我有同样的问题,但能够通过它使用:

                        it('Test', (done) => { 
                        //your code  
                        done();
                        }).timeout(10000);
                        

                        【讨论】:

                        • 这解决了我们使用 Mocha 的问题。虽然它似乎是创可贴的,但它现在完成了工作:-)
                        • 错误:解决方法被过度指定。指定回调返回一个Promise;不是两者。
                        • 为我工作。谢谢。
                        【解决方案17】:

                        这个想法是增加超时时间。
                        另一种方法是仅在必需的方法中执行此操作:

                         it('remove existing subdocument', function(done) {
                                 this.timeout(10000);
                              //your code is here
                              done();
                            });
                        

                        这有助于我解决问题。

                        【讨论】:

                          【解决方案18】:

                          我遇到了同样的问题,@MFAL 的评论链接有帮助。我正在扩展它。

                          当存在错误/不正确的断言时,promise 中会引发错误。这会导致 promise 被拒绝。一旦被拒绝 done 就永远不会被调用,并且 mocha 报告超时。 我通过编写 .catch 块并将其与 promise 链接起来解决了这个问题:

                                    it('resolves', (done) => {
                                      fooAsyncPromise(arg1, arg2).then((res, body) => {
                                          expect(res.statusCode).equal(incorrectValue);
                                          done();
                                      }).catch(done);
                                   });
                          

                          Wietse's blog 中提到的其他方式有:

                          链接一个then(done, done) 来处理promise 的resolve 和reject。

                                   it('resolves', (done) => {
                                     resolvingPromise.then( (result) => {
                                       expect(result).to.equal('promise resolved');
                                     }).then(done, done);
                                   });
                          

                          返回一个承诺:

                                  it('resolves', () => {
                                    return resolvingPromise.then( (result) => {
                                      expect(result).to.equal('promise resolved');
                                    });
                                  });
                          

                          使用异步/等待:

                                  it('assertion success', async () => {
                                    const result = await resolvingPromise;
                                    expect(result).to.equal('promise resolved'); 
                                  });
                          

                          【讨论】:

                          • 尝试了第一个选项但得到:else throw err ^ ReferenceError: done is not defined
                          • 做得好是函数范围内的参数变量,你应该能够得到它。您是否将参数传递为done
                          • 我正在使用 async/await,但在使用 @open-wc/testing 和 Karma 测试 LitElement Web 组件时仍然遇到此问题。不过,直到我的最新组件之前,我都没有遇到任何问题。 . . .我想知道差异化因素是什么。
                          • 当你发现错误时使用 done(error) 所以 Mocha 实际上报告了一个错误发生了。
                          猜你喜欢
                          • 2019-10-22
                          • 2019-07-30
                          • 2020-11-19
                          • 2021-09-05
                          • 2019-06-14
                          • 2021-09-13
                          • 2018-06-07
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多