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

zhte4eai  于 2022-11-05  发布在  iOS
关注(0)|答案(3)|浏览(220)

我创建了一个名为API的类,它是Axios的简单 Package 器

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

我尝试测试get方法的catch分支:
我试探着:

describe('API Throws Errors', () => {
  beforeEach(() => {
    // axios.get.mockImplementation(() => Promise.reject('rejected'));
    jest.mock('axios', () => ({
      get: jest.fn().mockReturnValue(Promise.reject('error'))
    }));
  });

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

  afterEach(() => {
    jest.clearAllMocks();
  });
});

h79rfbju

h79rfbju1#

您可以使用jest.mock来模拟axios.get的行为。将以下代码放在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);
    });
});
xytpbqjk

xytpbqjk2#

你可以像这样嘲笑axios拒绝承诺

jest.mock('axios', () => ({
  post: jest.fn(() => Promise.reject(new Error(''))),
  get: jest.fn(() => Promise.reject(new Error(''))),
  put: jest.fn(() => Promise.reject(new Error(''))),
  delete: jest.fn(() => Promise.reject(new Error(''))),
}));

这个方法对我来说非常有效。
希望这对你也有效。

zynd9foi

zynd9foi3#

toThrowError()应该是针对函数而不是结果Assert的,因为如果函数调用时发生错误,expect就没有机会被求值。它只适用于抛出错误的常规函数。它不适用于async函数,因为它们不抛出错误而是返回结果,这拒绝了承诺。
rejects.toThrowError()构造是一种如何Assert被拒绝的承诺的方法,Assert需要提供一个承诺,而不是一个返回它的函数:

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

相关问题