Jest单元测试 - 异步测试失败超时

时间:2018-01-08 00:15:01

标签: javascript jest

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

我已经尝试使用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);
  });  
});

2 个答案:

答案 0 :(得分:2)

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

在代码段中无法看到的是在我的测试文件的最后调用mongoose.connection.close();

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

由于我使用beforeAll()afterAll(),在所有测试开始之前从数据库加载一次数据,并在所有测试结束时清除数据库,我'我还包括使用beforeAll()内部的mongoose连接到数据库的调用。

希望这可以帮助那些也陷入困境的人。

答案 1 :(得分:0)

使用异步,您必须致电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();
  });  
});