【问题标题】:Expecting an error with axios-mock-adapter期望 axios-mock-adapter 出错
【发布时间】:2019-09-06 20:10:01
【问题描述】:

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

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

预期函数会引发错误。但它没有抛出任何东西。

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

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();
});

【问题讨论】:

    标签: javascript jestjs axios axios-mock-adapter


    【解决方案1】:

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

    看着 Jest 的documentation,在我看来你应该这样做:

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

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

    【讨论】:

      猜你喜欢
      • 2018-06-13
      • 2018-03-17
      • 1970-01-01
      • 2018-12-18
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      相关资源
      最近更新 更多