Por Lita García
Cuando construimos aplicaciones con Next.js, a veces necesitamos probar el comportamiento de window.location
, como por ejemplo cuando queremos hacer una recarga de la página. Pero, ¿cómo pruebas algo tan ligado al navegador? En esta guía rápida, mostraré cómo es posible utilizando Vitest.
Supongamos que queremos confirmar que la página se recarga cuando se hace clic en un botón. El componente que queremos probar sería el siguiente:
import React from 'react';
const ReloadButton = () => {
const handleReload = () => {
window.location.reload();
};
return (
<button onClick={handleReload} data-testid="reload-button">
Recargar Página
</button>
);
};
export default ReloadButton;
Para verificar este comportamiento, podríamos escribir la siguiente prueba:
import { render, screen, fireEvent } from '@testing-library/react';
import { describe, it, expect, vi } from 'vitest';
import ReloadButton from './ReloadButton';
describe('ReloadButton component', () => {
it('should call window.location.reload when button is clicked', () => {
// Guardamos el objeto original de window.location
const originalLocation = window.location;
// Mockeamos window.location con una función
Object.defineProperty(window, 'location', {
value: { reload: vi.fn() },
writable: true,
});
// Renderizamos el componente ReloadButton
render(<ReloadButton />);
// Simulamos que pulsamos el botón de recarga
const button = screen.getByTestId('reload-button');
fireEvent.click(button);
// Verificamos que se haya llamado a window.location.reload
expect(window.location.reload).toHaveBeenCalled();
// Restauramos el objeto original de window.location
Object.defineProperty(window, 'location', {
value: originalLocation,
writable: true,
});
});
});
window.location
para poder restaurarlo más tarde. Esto evitará efectos secundarios en otras pruebas.Object.defineProperty
para reemplazar window.location
con un objeto mock. Este mock incluye una función reload
utilizando la función de mockeo de Vitest (vi.fn()
).ReloadButton
usando @testing-library/react
.fireEvent.click
para simular un clic del usuario en el botón de recarga.reload
fue llamada utilizando expect
.:** Finalmente, restauramos el objeto original de
window.location` para mantener limpio el estado global.Mockear window.location
asegura que puedas probar el comportamiento de recarga sin depender del entorno del navegador. Al restaurar el estado original al final de la prueba, evitas introducir errores o inconsistencias en otras partes de tu aplicación o suite de pruebas.
Con este método, podemos probar con confianza incluso funcionalidades que dependen del navegador en cualquier proyecto de Next.js.
Object.defineProperty
Object.defineProperty
es un método de JavaScript que permite definir o modificar propiedades de un objeto con un control detallado sobre su comportamiento. En este caso, lo utilizamos para reemplazar el objeto window.location
con un mock que incluye una función reload
.
Parámetros principales:
window.location
).value
), si es modificable (writable
), entre otros.fireEvent.click
fireEvent.click
es una utilidad de la biblioteca @testing-library/react
que permite simular un evento de clic en un elemento del DOM durante una prueba. Esto es útil para replicar el comportamiento del usuario dentro de una prueba automatizada.
Cómo se utiliza:
fireEvent.click
para ejecutar el evento como si el usuario hubiera hecho clic.¿Quieres más? te invitamos a suscribirte a nuestro boletín para avisarte cada vez que recopilemos contenido de calidad que compartir.
Si disfrutas leyendo nuestro blog, ¿imaginas lo divertido que sería trabajar con nosotros? ¿te gustaría?
Pero espera 🖐 que tenemos un conflicto interno. A nosotros las newsletter nos parecen 💩👎👹 Por eso hemos creado la LEAN LISTA, la primera lista zen, disfrutona y que suena a rock y reggaeton del sector de la programación. Todos hemos recibido newsletters por encima de nuestras posibilidades 😅 por eso este es el compromiso de la Lean Lista