Как смоделировать ответ на запрос qraphQL / Apollo для тестирования action-creator в redux? - PullRequest
0 голосов
/ 04 ноября 2018

Поскольку у меня не было большого опыта работы с graphQL / Apollo, ответ на вопрос о тестировании с помощью Jest меня запутал. У меня есть создатель следующих действий:

export const fetchSomething = _id => (dispatch) => {
  client.query({
    query: gql`
    {
      something(_id: "${_id}") {
        _id
        somedata
      }
    }`,
  })
    .then(something => dispatch({
      type: FETCH_SOMETHING,
      payload: something.data,
    }));
};

И следующий тест, который не работает

  describe('fetchSomething', () => {
    it('should dispatch correct type and data correctly', async () => {
      const dispatch = jest.fn();
      client.query =
        async () => new Promise(resolve => resolve({ something: 'something' }));
      await fetchSomething('xxx')(dispatch);
      expect(dispatch).toHaveBeenCalledWith({ type: FETCH_SOMETHING,   payload: {something: 'something');
    });
  });

Мой файл ApolloClient.js

import ApolloClient from 'apollo-boost/lib/index.umd';

const client = new ApolloClient({
  uri: 'http://localhost:5000/graphql',
});

export default client;

Обычно для таких методов, как fetch, достаточно разрешить обещание смоделировать ответ. Который не работает для graphql / apollo для меня сейчас Как я могу издеваться над ответом в этом случае?

заранее спасибо

1 Ответ

0 голосов
/ 10 января 2019

Я вижу 2 вопроса:

1 - Вы не возвращаете обещание client.query, поэтому await fetchSomething в тесте фактически не ждет возврата этого обещания, прежде чем перейти к expect. return client.query должно это исправить.

2 - Вам также может понадобиться внедрить клиента в создателя действия. redux-thunk имеет опцию withExtraArgument, которая позволяет вам сделать это. Когда вы создаете свое хранилище резервов и применяете промежуточное программное обеспечение, вы можете передать фактический клиент Apollo, а затем в своих тестах вы можете передать свой client с поддельным query:

await fetchSomething('xxx')(dispatch, _, client); // the 2nd argument (getState) is unused

https://github.com/reduxjs/redux-thunk

...