Джест / Фермент | ComponentDidMount не вызывается, когда он должен - PullRequest
0 голосов
/ 13 марта 2019

У меня есть componentDidMount, который выполняет fetchUser(). Я пытаюсь проверить это componentDidMount.

Код компонента:

static propTypes = {
    match: PropTypes.shape({
      isExact: PropTypes.bool,
      params: PropTypes.object,
      path: PropTypes.string,
      url: PropTypes.string
    }),
    label: PropTypes.string,
    actualValue: PropTypes.string,
    callBack: PropTypes.func
  };

  state = {
    user: {}
  };

  componentDidMount() {
    this.fetchUser();
  }

  getUserUsername = () => {
    const { match } = this.props;
    const { params } = match;
    return params.username;
  };

  fetchUser = () => {
    getUser(this.getUserUsername()).then(username => {
      this.setState({
        user: username.data
      });
    });
  };

Тест:

    it('should call fetchUsers function only once', () => {
      const match = { params: { username: 'testUser' }, isExact: true, path: '', url: '' };
      const fetchUserFn = jest.fn(match);
      const wrapper = shallow(<UserDetailsScreen match={match} fetchUsers={fetchUserFn} />);
      wrapper.instance().componentDidMount(match);
      expect(fetchUserFn).toHaveBeenCalledTimes(1); // I get expected 1 and got 0
    });

Я имею в виду, почему это componentDidMount(), тестирование отличается от моих других? За последние несколько недель я проверил довольно много из них, никогда не сталкивался с этой проблемой. Может быть, потому что getUser() - это обещание, и мне нужно его издеваться. Кто-нибудь сталкивался с чем-то подобным раньше?

Код для getUser()

export const getUser = username => {
  const options = {
    method: httpMethod.GET,
    url: endpoint.GET_USER(username)
  };
  return instance(options);
};

1 Ответ

0 голосов
/ 13 марта 2019

Я нашел решение, используя spyOn(), шутя. Не знаю почему, мне нужно было шпионить за этим конкретным вариантом использования, но, пожалуйста, объясните, если можете. Решение ниже:

    it('should call fetchUsers function only once', () => {
      const match = { params: { username: 'testUser' }, isExact: true, path: '', url: '' };
      const fetchUserFn = jest.fn(match);
      const spy = jest.spyOn(UserDetailsScreen.prototype, 'componentDidMount');
      const wrapper = shallow(<UserDetailsScreen match={match} fetchUsers={fetchUserFn} />, {
        disableLifecycleMethods: true
      });
      wrapper.instance().componentDidMount(match);
      expect(spy).toHaveBeenCalledTimes(1);
    });

Одна оговорка здесь. Если вы не используете disableLifecycleMethods, функция будет вызвана дважды. Один раз за каждый рендер, если я не ошибаюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...