Как имитировать и протестировать Ax ios отклоненное обещание? - PullRequest
1 голос
/ 01 августа 2020

Я создал класс под названием API, и это простая оболочка вокруг Ax ios

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

Я пытаюсь протестировать ветвь catch метода get:

Я пробовал :

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

введите описание изображения здесь

Ответы [ 2 ]

2 голосов
/ 01 августа 2020

Вы можете имитировать поведение 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);
    });
});
0 голосов
/ 01 августа 2020
Предполагается, что

toThrowError() утверждается для функции, а не является результатом, потому что, если при вызове функции происходит ошибка, expect не имеет возможности быть вычисленным. Это применимо только к обычным функциям, в которых возникает ошибка. Это не применимо к функциям async, потому что они не выдают ошибку, а возвращают результат, который отклоняет обещание. Конструкция

rejects.toThrowError() - это способ утверждения отклоненного обещания, утверждение должно быть предоставляется обещание вместо функции, которая его возвращает:

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