当前位置: 首页 > 面试题库 >

对于异步测试和挂钩,请确保调用了“ done()”。如果返回承诺,请确保其解决

阎兴为
2023-03-14
问题内容

我在测试时遇到了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的评论链接提供了帮助。我正在扩展它。

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

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

Wietse博客中提到的其他方式是:

链接一个then(done, done)既处理承诺又解决承诺的a。

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


 类似资料:
  • 本文向大家介绍承诺回调和异步/等待,包括了承诺回调和异步/等待的使用技巧和注意事项,需要的朋友参考一下 首先,我们必须了解两个主要概念 同步编程 异步编程 同步编程 它等待每个语句完成执行,然后再转到下一条语句。 如果语句不相互依赖,但是由于它们在队列中,它们仍在等待执行,则此方法可能会减慢应用程序的速度。 异步编程 在移动到下一条语句之前,它不等待当前语句完成执行。例如,调用Web服务并使用Ja

  • 问题内容: 关于这两个重要来源:NZakas- 承诺链中的归还承诺 和MDN承诺,我想提出以下问题: 每次我们从承诺履行处理程序返回值时,该值如何传递给从同一处理程序返回的新承诺? 例如, 在这个例子中,是一个承诺。也是来自履行处理程序的承诺。但是。取而代之的是神奇地解决(如何?),然后将该值传递给的实现处理程序。即使是这里的句子也令人困惑。 您能给我解释一下这到底是怎么回事吗?我对这个概念感到困

  • 问题内容: 我正在使用promis模块从请求模块返回我的json数据,但是每次运行它时,它都会为我提供此信息。 我无法正常工作,有人知道这个问题吗?这是我的代码: 问题答案: 许诺是充当未来价值的占位符的对象。您的函数返回该Promise对象。通过将处理程序附加到promise,您可以在promise中获得未来的价值: 这是异步代码,因此,仅能通过处理程序来获得承诺的价值。 修改清单: 在返回的p

  • 问题内容: 我在自己的类中拥有所有异步调用,因此我不想将aync’ly设置为全局变量。为此,我想从我的asunc postProcess方法返回对象,例如字符串。 能做到吗? 下面是我类的一般结构,例如,我想从onPostExecute()返回一个字符串。我看到在其他地方提到了委托,但这似乎很混乱,确定有办法为类或方法提供返回类型吗? 问题答案: 像下面这样 和听众课 你可以这样打电话

  • 问题内容: Java和Mac都相当新。我想确保已设置JAVA_HOME,以便在其他程序中可以使用其路径。所以我做了一些谷歌搜索,这就是我得到的: 如果我在终端中输入 / usr / libexec / java_home ,则得到此信息: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home 但如果在终端中输入 echo

  • 对Java和Mac都很陌生...我想确定JAVA_HOME的设置,以便在其他程序中可以使用它的路径。所以我在谷歌上搜索了一下,下面是我得到的信息: 如果我在terminal中输入/usr/libexec/java_home,我会得到/system/library/java/javavirtualmachines/1.6.0.jdk/contents/home,但是如果我在terminal中输入ec