如何使用jest模拟异步提取?

时间:2018-06-05 04:23:33

标签: javascript node.js jestjs

我几天都在努力弄清楚如何正确测试这段代码:(

const request = require('superagent');

const getDog = () => {
  return request.get('https://dog.ceo/api/breeds/image/random');
};

it('resolves', () => {
  // Expect mocked response
});

it('rejects', () => {
  // Expect mocked response
});

2 个答案:

答案 0 :(得分:3)

在大多数情况下,您的代码会从API中获取一些价值来解析它并使用它来制作一些东西 因此,您不希望进行真正的API调用并改为模拟它 有几种方法可以做到这一点。其中一种可能是模拟superagent库上的唯一方法。

// tell jest not to mock superagent because we'll mock the only method
jest.unmock('superagent');

const request = require('superagent');

const getDog = () => {
  return request.get('https://dog.ceo/api/breeds/image/random');
};

it('resolves', () => {
  // mock the get request to resolve object
  request.get = jest.fn().mockResolvedValue({
  message: 'Your message'
  });
  // Expect mocked response
  expect.assertions(1);
  return expect(getDog()).resolves.toEqual({
  message: 'Your message'
  });
});

it('rejects', () => {
  // mock the get request to reject object
  request.get = jest.fn().mockRejectedValue({
  message: 'Your error'
  });
  // Expect mocked response
  expect.assertions(1);
  return expect(getDog()).rejects.toEqual({
    message: 'Your error'
  });
});

我使用expect.assertions(1),有reason

  

这在测试异步代码时通常很有用   确保回调中的断言实际上已被调用。

有些链接可以帮助您:  mockFn.mockResolvedValue(value) .rejects

答案 1 :(得分:0)

一种解决方案是使用诸如nockfetch-mock之类的库来模拟对您的请求的HTTP响应。