如何模拟和测试Axios拒绝的承诺?

时间:2020-08-01 04:37:59

标签: javascript jestjs axios

我创建了一个名为API的类,它是围绕Axios的简单包装器

@filter = @class_search.categories.push(@class_search.business).push(@class_search.stage).flatten.reject(&:blank?)
@classses = Classs.all.tagged_with(@filter, any: true)

我正在尝试测试get方法的catch分支:

我尝试过:

export class API {    
  static get = async (route: string, version: string = API_VERSION) => {
    try {
      return await axios.get(`${BASE_URL + version}${route}`);
    } catch (error) {
      throw error;
    }
  };
}

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以使用axios.get模拟jest.mock的行为。将以下代码放在describe部分的上方:

jest.mock('axios', () => ({
  get: jest.fn().mockReturnValue(Promise.reject('error'))
}));

然后测试如下错误:

it('get fails', async () => {
    await expect(API.get("bad_url")).rejects.toEqual('error');
});

确切代码

jest.mock('axios', () => ({
    get: jest.fn().mockReturnValue(Promise.reject('error')),
}));

describe('API Throws Errors', () => {
    it('get fails', async () => {
        await expect(API.get(GROUPS.url())).rejects.toEqual('error');
    });
});

注意

如果您有另一个不应失败的测试用例,则可以对其进行模拟以返回Promise.resolve()。或者,您可以简单地清除该模拟。

describe('API Throws Errors', () => {
    it('get fails', async () => {
        await expect(API.get(GROUPS.url())).rejects.toEqual('error');
    });
    
    it('should success', async () => {
        Axios.get.mockReturnValue(Promise.resolve(SOME_VALUE));
        await expect(API.get(GROUPS.url())).resolves.toEqual(SOME_VALUE);
    });
});

答案 1 :(得分:0)

toThrowError()应该针对某个函数断言而不是结果,因为如果函数调用发生错误,expect则没有机会进行评估。它仅适用于引发错误的常规函数​​。它不适用于async函数,因为它们不会抛出错误而是返回结果,从而拒绝了Promise。

rejects.toThrowError()的构造是断言承诺的断言的一种方式,断言需要提供一个断言而不是返回它的函数:

await expect(API.get("bad_url")).rejects.toThrowError();