15

我正在尝试使用 测试 axios get 请求axios-mock-adapter,从而在状态不等于 200 的情况下引发错误。但是,当我执行测试时(请参阅api.test.js),我收到以下消息:

错误:expect(function).toThrowError(undefined)

期望函数抛出错误。但它没有扔任何东西。

如何axios-mock-adapter使用 mygethandleResponse方法进行测试以确保引发错误?谢谢!

api.test.js:

import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';

const handleResponse = (response) => {
  if (response.status !== 200) {
    throw new Error('foo');
  } else {
    return response.data;
  }
};

const get = async (url) => {
  const response = await axios.get(url, {withCredentials: true});
  return handleResponse(response);
};

test('testing that, when making a get request to the appropriate url, an error is thrown ' +
     ' when status !== 200', async () => {
  new MockAdapter(axios)
    .onGet('sampleUrl')
    .reply(500, {data: 'payload'});
  const expectedError = async () => {
    await get('sampleUrl');
  };
  expect(expectedError).toThrowError();
});
4

1 回答 1

8

我在您的代码中看到的问题是expect().toThrowError()需要同步异常,但您的代码实际上拒绝了一个承诺。可能令人困惑的是您throw new Error('foo');handleResponse. 这是抛出异常,真的。然而,因为这个代码是由一个async函数调用的,所以这个异常被转换为一个承诺拒绝。因此await get('sampleUrl')不会导致引发同步异常,而是会导致异步承诺拒绝。

查看 Jest 的文档,在我看来您应该这样做:

return expect(expectedError()).rejects.toThrowError();

您需要调用expectedError,因为它是一个返回承诺的函数,并且您需要使用.rejects将拒绝转换为可以使用.toThrowError(). 确保返回断言,或者await它。否则你会有悬而未决的承诺。

于 2019-04-18T22:05:54.360 回答