Tester les interactions utilisateur
Tester les interactions utilisateur
Les tests gĂ©nĂ©rĂ©s peuvent ĂȘtre complĂ©tĂ©s afin de vĂ©rifier les interactions utilisateur dans une vue.
Ces tests permettent de sâassurer quâune action rĂ©alisĂ©e dans lâinterface dĂ©clenche bien le comportement attendu.
Ils sont notamment utiles pour tester :
- un clic sur un bouton ;
- une saisie dans un champ ;
- le dĂ©clenchement dâune action de parcours ;
- lâappel dâune mutation GraphQL ;
- la mise Ă jour de lâaffichage aprĂšs une action.
Test dâaffichage
Un test dâaffichage permet de vĂ©rifier que la vue se rend correctement une fois les donnĂ©es chargĂ©es.
Le test suit généralement les étapes suivantes :
- configurer les mocks avec setupServer ;
- rendre le composant ;
- attendre le retour des appels API et des queries GraphQL interceptés via MSW ;
- vérifier le rendu stabilisé de la vue.
Exemple de test dâaffichage
it('simple test - snapshot', async () => { setupServer(); const { container } = render(<Home />, { wrapper: ({ children }) => ( <TestsProviders environment=ï»ż> ï»ż </TestsProviders> ) });
await screen.findByRole('heading', { value: viewIds.HOME }); await screen.findByText('Is loaded GetProject: yes');
expect(container).toMatchSnapshot(); });
Test dâinteraction utilisateur
Un test dâinteraction permet de vĂ©rifier le comportement dâune vue lorsquâun utilisateur rĂ©alise une action.
Le test suit généralement les étapes suivantes :
- configurer lâutilisateur avec userEvent.setup() ;
- configurer les mocks avec setupServer ;
- rendre le composant ;
- attendre le chargement des données nécessaires ;
- interagir avec le DOM, par exemple avec click, type ou dblClick ;
- attendre le retour de lâaction effectuĂ©e ;
- vérifier que la mutation GraphQL a été appelée avec les bonnes données.
Exemple de test dâaction NEXT
it('userEvent - action - NEXT', async () => { const user = userEvent.setup(); let isMutationValid = new Promise((resolve, reject) => { setTimeout(() => reject('did not handle the request'), 1500); });
setupServer([ graphql.mutation('ProcessActionMutation', (req, res, ctx) => { const { input } = req.variables;
isMutationValid = Promise.resolve( equals(input, { action: 'HOME_NEXT', viewId: 'HOME' }) );
return res( ctx.data({ processAction: { ok: true, error: null, process: { id: 'id', context: { projectId: 'projectId', viewId: 'HOME', actions: ['NEXT', '_DEFAULT_'] } } } }) ); }) ]);
render(<Home />, { wrapper: ({ children }) => ( <TestsProviders environment=ï»ż> ï»ż </TestsProviders> ) });
await screen.findByRole('heading', { value: viewIds.HOME }); await screen.findByText('Is loaded GetProject: yes');
const button = await screen.findByRole('button', { name: 'NEXT' });
await user.click(button);
await waitFor(() => expect(isMutationValid).toBeTruthy()); });
Exemple de test avec mutation GraphQL
Lâexemple suivant illustre un test dĂ©clenchant une mutation GraphQL Ă partir dâune action utilisateur dans la page.
it('simple test - create a customer', async () => { const user = userEvent.setup(); let isMutationValid = new Promise((resolve, reject) => { setTimeout(() => reject('did not handle the request'), 1500); });
setupServer([ graphql.mutation('CreateCustomerMutation', (req, res, ctx) => { const { input } = req.variables;
isMutationValid = Promise.resolve( equals(input, { email: '[email protected]', firstName: 'starter', lastName: 'starter' }) );
return res( ctx.data({ createCustomer_M_start: { ok: true, error: null } }) ); }),
graphql.query('GetCustomerQuery', (req, res, ctx) => { return res( ctx.data({ getCustomer_start: { email: '[email protected]', firstName: 'starter', lastName: 'starter' } }) ); }) ]);
render(<Start />, { wrapper: ({ children }) => ( <TestsProviders environment=ï»ż> ï»ż </TestsProviders> ) });
await screen.findByRole('heading', { value: viewIds.START }); await screen.findByText('Is loaded GetStartProject: yes'); await screen.findByText('Is loaded GetCustomer: yes');
const button = await screen.findByRole('button', { name: 'Create Customer' });
await user.click(button);
await waitFor(() => expect(isMutationValid).toBeTruthy()); });
Bonnes pratiques
Pour tester une interaction utilisateur, il est recommandé de :
- attendre que la vue soit rĂ©ellement chargĂ©e avant dâinteragir avec elle ;
- utiliser userEvent pour simuler les actions utilisateur ;
- vérifier les variables envoyées à la mutation GraphQL ;
- mocker explicitement les queries ou mutations nécessaires au scénario ;
- Ă©viter les snapshots trop larges lorsque le comportement attendu peut ĂȘtre vĂ©rifiĂ© plus prĂ©cisĂ©ment.
Remarques
Les tests gĂ©nĂ©rĂ©s automatiquement doivent ĂȘtre considĂ©rĂ©s comme une base.
LâĂ©quipe projet peut les complĂ©ter afin de couvrir les rĂšgles spĂ©cifiques au parcours, les cas dâerreur ou les interactions mĂ©tier importantes.