为什么JEST模拟模块的异步函数不需要异步或断言或解析

时间:2019-01-08 01:00:38

标签: unit-testing jestjs

全部

我对Jest还是陌生的,Testing Async Code section给我造成了极大的困惑,它提供了许多处理同一案件的方法:

[1] done()
[2] expect.assertions(1) + return Promise
[3] expect.assertions(1) + return expect.resolves
[4] async callback +  await + NO return expect

更令人困惑的是,当我到达Mock Functions section时:

The mock module section:

//users.test.js
import axios from 'axios';
import Users from './users';

jest.mock('axios');

test('should fetch users', () => {
  const resp = {data: [{name: 'Bob'}]};
  axios.get.mockResolvedValue(resp);

  // or you could use the following depending on your use case:
  // axios.get.mockImplementation(() => Promise.resolve(resp))

  return Users.all().then(users => expect(users).toEqual(resp.data));
});

我想知道这4种方式中的哪一种?有细节吗?

1 个答案:

答案 0 :(得分:1)

测试为returning a Promise

对应于[2] expect.assertions(1) + return Promise

请注意,如果您期望expect.assertions拒绝并使用Promise,则只需使用catch

  

如果您希望诺言被拒绝,请使用.catch方法。确保添加Expect.assertions以验证是否调用了一定数量的断言。否则,兑现承诺就不会使测试失败。

如果期望Promise可以解决,那么您可以像代码示例中那样在then中进行声明,并简单地返回结果Promise

  

只需从测试中返回一个承诺,Jest将等待该承诺解决。如果诺言被拒绝,则测试将自动失败。