Patrones en RTL
Consulte a continuación algunos patrones comunes en RTL. Tenga en cuenta que estos ejemplos no son un código completo y es posible que no funcionen en todos los casos.
Organización
La renderización básica se logra mediante el reemplazo de las funciones mount o shallow por la función render. Debe importar la función render desde el paquete @jutro/test.
render(<Component />);
El siguiente ejemplo muestra TranslatorProvider, pero ModalNextProvider, ThemeProvider, BreakpointTrackerProvider y también router se incluyen.
render(<Component />);
Al pasar propiedades a un contexto, debe especificar un segundo argumento para render que incluya opciones de renderización. La lista completa de opciones se puede encontrar aquí.
También puede configurar proveedores de contexto utilizando la variable providers, como se muestra a continuación. Puede pasar propiedades al proveedor, deshabilitarlo o sustituirlo por su propio proveedor personalizado. Hay cinco proveedores que puede configurar:
routerglobalizationmodalNextthemebreackpointTracker
render(<Component />, {
providers: {
globalization: {
props: {
defaultLocale: someLocale,
},
},
},
});
Actuación
Simular un evento de clic en RTL es simple:
userEvent.click(button);
Simular el ingreso de un valor en un campo es mucho más sencillo en RTL. La función userEvent.clear borra el campo y la userEvent.type escribe caracteres en él. Consulte los userEvent documentos para obtener más información acerca de la utilidad userEvent.
userEvent.clear(input);
userEvent.type(input, 'myValue{enter}');
No hay forma en RTL de llevar el foco o desenfocar directamente un elemento determinado, pero puede simular fácilmente el resultado de la tecla Tab.
Nota: Esto solo funcionará si el botón es el primer elemento en recibir el foco en la página. Si es el segundo elemento en recibir el foco, se necesitaría presionar tres veces la tecla Tab: dos para llevar el foco al botón y un tercero para desenfocarlo.
userEvent.tab();
userEvent.tab();
Aserción
Cómo verificar si una entrada tiene el valor deseado:
expect(screen.getByRole('textbox')).toHaveValue('foo');
Cómo verificar si existe un botón y si tiene un aria-label traducido correctamente:
const myButton = screen.getByLabelText(getTranslation(messageProps.myBtnLabel));
expect(myButton).toBeInTheDocument();
El siguiente ejemplo ilustra que las aserciones son idénticas cuando se utilizan simulaciones. La única diferencia sería en el código de acción:
const callbackSpy = jest.fn();
// some actions happen
expect(callbackSpy).toHaveBeenCalledWith(
newValue,
undefined,
expect.anything()
);
El comparador className tiene un nombre diferente en @testing-library/jest-dom. Encontrará la lista de todos los comparadores aquí.
expect(element).toHaveClass('someClass');
Cómo verificar si existe un elemento con un texto determinado:
expect(screen.getByText(getTranslation('myText'))).toBeInTheDocument();
Cómo verificar si una casilla de verificación está marcada:
const checkbox = screen.getByRole('checkbox');
expect(checkbox).toBeChecked();
A continuación, se muestra cómo verificar si la entrada está deshabilitada de manera accesible. Tenga en cuenta que .toBeDisabled() no se puede utilizar aquí porque no tiene en cuenta la presencia o ausencia del atributo aria-disabled.
expect(input).toHaveAttribute('aria-disabled', 'true');