Настройка React-Storybooks с помощью React-Apollo
Есть ли способ использовать React-Apollo с React-Storybooks? Ранее я пробовал Relay, и есть модуль ( https://github.com/orta/react-storybooks-relay-container), который позволял создавать контейнеры-заглушки, которые не требовали бы доступа к сети, но использовали статические данные.
Есть ли эквивалент для платформы React-Apollo? http://dev.apollodata.com/react/
Я работаю с React-Native, но идея и настройка всего этого должны быть очень похожими (например, я использую https://github.com/storybooks/react-native-storybook вместо веб-решения)
2 ответа
Что ж, это довольно старый вопрос, но я опубликую ответ здесь для любого дальнейшего партнера по разработке, которому нужен ответ. пожалуйста, если это хорошо для кого-то, и это не достаточно ясно, просто дайте мне знать, и я обновлю свой ответ
Для того, чтобы заставить его работать (react-apollo
а также react-storybook
) у вас есть несколько подходов, из которых мой любимый будет использовать MockedProvider
от react-apollo
что вы в основном хотите сделать, так это сообщить своему пользовательскому интерфейсу, что всякий раз, когда ожидается ожидаемый запрос, он должен отвечать ожидаемым ответом, поэтому давайте сделаем пример с использованием компонента <Avatar>
для этого нужны пользовательские данные для правильной визуализации:
Avatar.js
class Avatar {
// ...
render() {
// pretty avatar layout
}
}
export const COLLABORATOR_QUERY = gql`
query GetCollaborator($id: ID!) {
Collaborator(id: $id) {
id
firstName
lastName
avatarImgUrl
}
}
`;
const AvatarWithData = graphql(
COLLABORATOR_QUERY, {
options: {
variables: {
// let's suppose that we got a static variable here to simplify the example
id: '1'
}
}
}
)(Avatar);
export default AvatarWithData;
.stories / index.js
import { addTypenameToDocument } from 'apollo-client/queries/queryTransform';
import { MockedProvider } from 'react-apollo/lib/test-utils';
import { COLLABORATOR_QUERY } from '../js/components/Avatar';
import Avatar from '../js/components/Avatar';
const mockedData = {
Collaborator: {
id: '1',
firstName: 'Char',
lastName: 'Mander',
avatarImgUrl: 'https://img.pokemondb.net/artwork/charmander.jpg',
__typename: 'Collaborator'
}
};
const query = addTypenameToDocument(USER_QUERY);
const variables = { id: '1' };
let mocks = [{ request: { query, variables }, result: { data: mockedData } }];
storiesOf('Mocked', module)
.addDecorator((story) => (
<MockedProvider mocks={mocks}>
{story()}
</MockedProvider>
)).add('Avatar', () => {
return (<Avatar />);
});
У меня есть некоторые проблемы с этим addTypenameToDocument
импорт, потому что они используют машинописный текст, и с моим образцом создания-реакции-приложения что-то не так, но я сделал, чтобы включить логику в этот файл в мой проект (очень грязно, извините за это).
ОБНОВЛЕНИЕ: чтобы избежать проблем с импортом addTypenameToDocument
что я сделал, как я использую create-react-project
это бежать eject
команду и добавьте следующее к package.json
шутливая конфигурация:
"transformIgnorePatterns": ["[/\\\\]node_modules[/\\\\](?!(apollo-client)/).+\\.(js|jsx)$"]
Проблема в том, что ребята в apollo-client
имеет es6 в своих построенных файлах, и вы получите синтаксическую ошибку, к тому же, если вы используете историю сборника рассказов, вы, возможно, захотите добавить эту конфигурацию в конфигурацию веб-пакета сборника рассказов.
Перед тем, как делать все, что я нашел, это: https://dev-blog.apollodata.com/seamless-integration-for-graphql-and-react-6ffc0ad3fead в разделе "Тест" также есть отличный подход (почти то же самое) но они не используют addTypenameToDocument
Я еще не пробовал себя, но если это сработает, вы сможете протестировать, не выполнив команду eject на реагировать-создать-проект
Кроме этого, вы должны быть уверены, что ваш запрос и переменные совпадают точно так же, как и запрос, сделанный вашим компонентом пользовательского интерфейса, в противном случае вы получите ошибку, которая не была проверена как поддельная, и вы готовы к откату.
Мой случай был похожим, но с другой библиотекой, не React Storybooks, а с Apollo Client.
Если кто-то ищет то же самое, я публикую здесь то, что я сделал.
В конфиге шутки мне пришлось поставить:
"moduleNameMapper": {
"\\.(css|less|scss|sass)$": "identity-obj-proxy"
},
"transformIgnorePatterns": [
"<rootDir>/node_modules\\/(?!(apollo-client)\\/).*/"
]
Конечно, с установкойnpm i -D identity-obj-proxy