Instancia de Componente
mount devuelve un VueWrapper con muchos métodos convenientes para probar los componentes de Vue. A veces, es posible que desee acceder a la instancia subyacente de Vue. Puede acceder a eso con la propiedad vm.
Un Ejemplo Simple
Aquí hay un componente simple que combina accesorios y datos para representar un saludo:
import { mount } from '@vue/test-utils'
test('renders a greeting', () => {
const Comp = {
template: `<div>{{ msg1 }} {{ msg2 }}</div>`,
props: ['msg1'],
data() {
return {
msg2: 'world'
}
}
}
const wrapper = mount(Comp, {
props: {
msg1: 'hello'
}
})
// console.log(wrapper.vm)
expect(wrapper.html()).toContain('hello world')
})Echemos un vistazo a lo que está disponible en vm con console.log(wrapper.vm):
{
msg1: [Getter/Setter],
msg2: [Getter/Setter],
hasOwnProperty: [Function]
}¡Podemos ver tanto msg1 como msg2! También se mostrarán cosas como methods y propiedades computed, si están definidas. Al escribir una prueba, si bien generalmente se recomienda afirmar contra el DOM (usando algo como wrapper.html()), en algunas circunstancias excepcionales es posible que necesite acceso a la instancia de Vue subyacente.
Uso con getComponent y findComponent
getComponent y findComponent devuelven un VueWrapper, muy parecido al que se obtiene de mount. Esto significa que también puede acceder a las mismas propiedades, incluida vm, en el resultado de getComponent o findComponent.
Aquí hay un ejemplo simple:
import { mount } from '@vue/test-utils'
test('asserts correct props are passed', () => {
const Foo = {
props: ['msg'],
template: `<div>{{ msg }}</div>`
}
const Comp = {
components: { Foo },
template: `<div><foo msg="hello world" /></div>`
}
const wrapper = mount(Comp)
expect(wrapper.getComponent(Foo).vm.msg).toBe('hello world')
expect(wrapper.getComponent(Foo).props()).toEqual({ msg: 'hello world' })
})Una forma más completa de probar esto sería afirmar contra el contenido renderizado. Hacer esto significa que afirma que se pasa y se procesa la propiedad correcta.
CONSEJO
Nota: si está utilizando un componente <script setup>, vm no estará disponible. Esto se debe a que los componentes de <script setup> están cerrados de forma predeterminada. Para estos componentes, y en general, considere evitar vm y afirmar contra el marcado renderizado.
ADVERTENCIA
Tipo WrapperLike cuando se usa el selector CSS
Al usar wrapper.findComponent('.foo'), por ejemplo, VTU devolverá el tipo WrapperLike. Esto se debe a que los componentes funcionales necesitarían un DOMWrapper, de lo contrario, un VueWrapper. Puede forzar la devolución de un VueWrapper proporcionando el tipo de componente correcto:
wrapper.findComponent('.foo') // returns WrapperLike
wrapper.findComponent<typeof FooComponent>('.foo') // returns VueWrapper
wrapper.findComponent<DefineComponent>('.foo') // returns VueWrapperConclusión
- Use
vmpara acceder a la instancia interna de Vue getComponentyfindComponentdevuelven un contenedor Vue. Esas instancias de Vue también están disponibles a través devm