为什么我的异步Jest测试没有失败呢?

时间:2016-10-31 19:53:10

标签: javascript asynchronous es6-promise jestjs

我需要使用Jest测试一些异步操作。当我的测试失败时,我的测试正在通过。

describe('Asynchronous Code', () => {
  it('should execute promise', () => {
    console.log(1);
    someFunctionThatReturnsAPromise()
      .then(() => {
        console.log(2);
        expect(true).toBeFalsy();
        console.log(3);
      });
    console.log(4);
  });
});

当我运行npm test时,我得到以下输出:

PASS  __tests__/Async.test.js
 ● Console

   console.log __tests__/Async.test.js:3
     1
   console.log static-content-test/react/actions/DashboardActions.test.js:6
     2
   console.log static-content-test/react/actions/DashboardActions.test.js:10
     4

正如您所看到的,测试正在通过,但console.log(3)永远不会被执行,因为true不是假的,期望失败。

如何让Jest在异步回调中识别我的期望?

3 个答案:

答案 0 :(得分:8)

在测试异步代码时,您需要从测试中返回promise。将测试体更改为:

return someFunctionThatReturnsAPromise()
  .then(() => {
    expect(true).toBeFalsy();
  });

有了这个,测试失败了:

FAIL  __tests__/Async.test.js
 ● Asynchronous Code › should execute promise

   expect(received).toBeFalsy()

   Expected value to be falsy, instead received
     true

This is the pattern facebook uses for testing async code with jest.

答案 1 :(得分:2)

或者,您可以按照done模式as described here

进行操作
it('should execute promise', (done) => {
  someFunctionThatReturnsAPromise()
    .then(() => {
      expect(true).toBeFalsy();
      done();
    });
});

这适用于Jest,但更常用于Jasmine和Mocha。

答案 2 :(得分:0)

这是替代解决方案。

玩笑将在到达上下文结尾时终止。因此,您需要从回调中返回承诺,以使其等待承诺得到解决和测试。

我们说有希望

const promise=fetch("blah.com/api")

test("should return valid data",()=>{
   return expect(promise).resolves.toBeTruthy() 
})

.resolves等待promise解析,然后您应用适当的方法 matchers如您所愿。

在检查错误情况时,也可以使用.rejects