【问题标题】:Jest unit testing - Async tests failing Timeout笑话单元测试 - 异步测试失败超时
【发布时间】:2018-01-08 00:15:01
【问题描述】:

我收到以下错误消息“超时 - 在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时内未调用异步回调。”最重要的是,我还收到一条错误消息,指出执行了 0 个断言,而预期有 2 个断言。

我已尝试使用 jest.setTimeout(10000) 将超时时间延长至 10 秒,这应该足以执行该代码,但问题仍然存在。

我知道m.employeeGetAll() 有效,因为当我使用浏览器测试我的网络应用程序时,我可以在视图中看到员工列表。

这是我的测试的样子

it('Lists all employees successfully', () => {
  expect.assertions(2);
  return m.employeeGetAll().then(result => { //m.employeeGetAll() returns a promise       
    expect(result).toBeDefined();
    expect(result.length).toBe(3);
  });  
});

【问题讨论】:

  • 我尝试在.catch(e => {console.log (Error: ${e})) 上方的返回语句中添加额外的代码,以尝试获取一些输出以查看我的承诺是否失败。但是,它最终什么都不做,并继续抛出超时错误。我对为什么永远不会返回承诺感到困惑。 m.employeeGetAll() 中的代码只是对 mongoose.model().find({}).exec() 的调用,根据 mongoose 的文档,这应该返回一个承诺。

标签: javascript jestjs


【解决方案1】:

我发现的问题是异步代码的工作方式。

在代码 sn-p 中看不到的是在我的测试文件末尾对 mongoose.connection.close(); 的调用。

此调用必须在 Jest 单元测试框架的 afterEach()afterAll() 函数内完成。否则,与数据库的连接将在测试完成之前关闭,因为我的控制器方法中的所有调用都是异步的;这导致永远不会返回任何承诺,并且代码进入超时状态。

由于我使用beforeAll()afterAll() 在所有测试开始前从数据库加载一次数据并在所有测试结束时清除数据库,因此我已经包含了连接到数据库的调用在beforeAll() 中也使用猫鼬。

希望这对同样陷入我困境的人有所帮助。

【讨论】:

    【解决方案2】:

    使用 async 你必须调用done

    it('Lists all employees successfully', (done) => {
      expect.assertions(2);
      return m.employeeGetAll().then(result => { //m.employeeGetAll() returns a promise       
        expect(result).toBeDefined();
        expect(result.length).toBe(3);
        done();
      });  
    });
    

    【讨论】:

    • facebook.github.io/jest/docs/en/asynchronous.html#promises 我刚刚尝试了这种方法,不幸的是,我仍然收到相同的错误消息。
    • @geekster01 你是对的,Jest 可以根据documentation 返回一个承诺,但也许承诺永远不会解决。如果done 不起作用,那么您应该看看为什么承诺没有解决。通过在 console.log 上设置断点来确保是这种情况
    • 感谢@HMR 的提示。我去看看。
    猜你喜欢
    • 1970-01-01
    • 2020-10-08
    • 2016-07-25
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    相关资源
    最近更新 更多