Как правильно проверить отклоненное обещание с помощью Jest? - PullRequest
0 голосов
/ 12 июня 2018

Код:

import { createUser } from '../services';
...
...

handleFormSubmit = () => {  
  this.setState({ loading: true });
  createUser()
    .then(() => {
      this.setState({
        loading: false,
      });
    })
    .catch(e => {
       this.setState({
         error: e,
       });
    });
};

Тест:

 it('rejects...', () => {
    const Container = createUserContainer(CreateUser);
    const wrapper = shallow(<Container />);  

    return wrapper.instance().handleFormSubmit()
      .catch(e => {
         console.log("State: ", wrapper.state());
         expect(e).toEqual('error');
      });
 });

Макет

export const createUser = function() {
  return new Promise((resolve, reject) => {
    reject('error');
  });
};

Тест вынуждает код переходить к уловке в методе.Таким образом, для состояния устанавливается значение «ошибка».

Но в моем тесте он не выполняет то, что я ожидаю, и жду, пока Обещание не отклонится, прежде чем проверять изменение состояния.Я не уверен, что здесь попробовать, я должен использовать async / await?

Так что это метод createUser, которого я хочу ждать, но я не уверен, что моя реализация допускает это

Ответы [ 2 ]

0 голосов
/ 20 июля 2019

Ваш код выглядит правильно.Почему вы говорите, что он не ждет, пока Обещание не отклонит?Единственное отличие, которое я хотел бы сделать, - это использовать насмешливую способность Jest, поэтому измените

Mock

export const createUser = function() {
  return new Promise((resolve, reject) => {
    reject('error');
  });
};

на

Test

jest.mock('../services');
const services = require('../services');

const createUser = jest.spyOn(services, "createUser");
createUser.mockRejectedValue("error");

...

it('rejects...', () => {

Нет необходимости иметь отдельный файл Mock

0 голосов
/ 12 июня 2018

В вашем коде handleFormSubmit функция должна вернуть Promise, на котором вы можете подождать в своем тесте.Кроме того, вам необходимо вернуть правдивые данные об успешном и обратном вызове ошибки, чтобы разрешить и отклонить обещание соответственно.

handleFormSubmit = () => {  
  this.setState({ loading: true });
  return createUser()
    .then(() => {
      this.setState({
        loading: false,
      });
      return true;
    })
    .catch(e => {
       this.setState({
         error: e,
       });
       throw e;
    });
};

Здесь, в вашем фактическом коде, вы поймали ошибку в обработчике catch и пытаетесь ее перехватить дальше.в тестовом коде.Следовательно, catch не может быть цепочкой дальше, в то время как вы можете then соединяться несколько раз.

Для справки просмотрите документацию Promise: https://www.peterbe.com/plog/chainable-catches-in-a-promise

...