Storybook6.4リリースに伴いplay
関数と@testing-library/user-event
で インタラクションの定義を試そうとしたところ、そのコンポーネントがReduxのstoreの値を使うためProvider
を利用する必要があるのだが、testing-reactのexampleを探してもplay
関数と仮想DOMの両方を定義する方法がわからなかったので調べた
前バージョンStorybookでのProvider
を使ったストーリーはこのように書いていた
const store = ... const Template: Story = () => ( <Provider store={store} key="provider"> <TranslationProvider initialState={store.getState().app.translation}> <TopPage /> </TranslationProvider> </Provider> ); export const EN = Template.bind({});
READMEにあったplay関数の作り方
export const InputFieldFilled: Story<InputFieldProps> = { play: async ({ canvasElement }) => { const canvas = within(canvasElement); await userEvent.type(canvas.getByRole('textbox'), 'Hello world!'); }, };
これをどう一緒に使うべきか
@testing-react
のREADMEをよくみるとCSF3におけるストーリの作り方の例が以下となっていた
// Example 1: Meta with component property export default { title: 'Button', component: Button // <-- This is strictly necessary } // Example 2: Story with render method: export const Primary = { render: (args) => <Button {...args}> }
つまり、render
を使うのがよさそう
ということで以下のように定義したらうまく表示された
export const InputFieldFilled = { render: () => ( <Provider store={store} key="provider"> <TranslationProvider initialState={store.getState().app.translation}> <TopPage /> </TranslationProvider> </Provider> ), play: async () => { await userEvent.type( screen.getByTestId("email"), "michael@chromatic.com", ) }, };