繁体   English   中英

如何模拟和测试 Axios 拒绝 promise?

[英]How to mock and test Axios rejected promise?

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

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

在此处输入图像描述

您可以使用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);
    });
});

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

rejects.toThrowError()构造是一种方式拒绝 promise 可以被断言,断言需要提供 promise 而不是 function 返回它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM