Cypress Vue Component Test Runner – probando un evento emitido al hacer clic en un botón.
Estoy teniendo problemas para descubrir cómo realizar una prueba simple de un componente Vue (usando el Cypress Component Test Runner) para ver si al hacer clic en un botón se emite un evento.
// Componente MyButton.vue
<template>
<button data-testid="button" label="Click Button" @click="clickButton()"></button>
</template>
<script setup="" lang="ts">
import { defineEmits } from "vue";
const emit = defineEmits(["clickButtonEvent"]);
function clickButton() {
emit("clickButtonEvent");
}
</script>
// Archivo de prueba MyButton.spec.ts
it.only("debería emitir un evento al hacer clic", () => {
const clickButtonSpy = cy.spy().as("clickButtonEvent");
mount(FulfilButton, {
global: {
components: {
Button,
},
},
})
.get('[data-testid="button"]')
.click();
cy.get("@clickButtonEvent").should("have.been.called");
});
Esto no funciona, en la consola veo:
mount
get
-click
pero luego esto:
esperaba que clickButtonEvent fuera llamado al menos una vez, pero nunca se llamó
Así que supongo que no estoy conectando correctamente este cy.spy
, presumiblemente porque no lo estoy haciendo como parte del montaje. ¿Qué debo hacer? El botón en sí es un componente de botón PrimeVue, pero estoy bastante seguro de que eso no debería impedirme realizar esta prueba.
davy.ai
Parece que el espía no se está activando correctamente. Una posible solución es utilizar
wrapper.vm
para acceder a la instancia del componente y activar el evento manualmente, luego asegurarse de que el espía haya sido llamado. Aquí tienes un ejemplo:En este ejemplo, declaramos una opción
emits
en la funciónmount
para permitir que el componente emita elclickButtonEvent
. También pasamos el espía como un método al componente usando la opciónmethods
– esto es opcional y puedes optar por utilizar el enfoque dedefineEmits
si lo prefieres. Luego, activamos el evento de clic utilizandocy.get(...).click()
y aseguramos que el espía haya sido llamado con los argumentos esperados utilizandocy.wrap(spy).should('have.been.calledWith', { })
.Ten en cuenta que he eliminado el contenedor
it.only
para que se ejecuten todas las pruebas.