Pular para o conteúdo principal

Vue.js

Vue.js é um framework acessível, performático e versátil para construir interfaces de usuário web. Você pode testar componentes Vue.js diretamente em um navegador real usando WebdriverIO e seu browser runner.

Configuração​

Para configurar o WebdriverIO em seu projeto Vue.js, siga as instruções em nossa documentação de teste de componentes. Certifique-se de selecionar vue como preset dentro das opções do runner, por exemplo:

// wdio.conf.js
export const config = {
// ...
runner: ['browser', {
preset: 'vue'
}],
// ...
}
informação

Se você já estiver usando o Vite como servidor de desenvolvimento, você também pode reutilizar sua configuração em vite.config.ts dentro da sua configuração WebdriverIO. Para mais informações, consulte viteConfig nas opções do runner.

O preset do Vue requer que @vitejs/plugin-vue esteja instalado. Também recomendamos o uso da Testing Library para renderizar o componente na página de teste. Portanto, você precisará instalar as seguintes dependências adicionais:

npm install --save-dev @testing-library/vue @vitejs/plugin-vue

Você pode então iniciar os testes executando:

npx wdio run ./wdio.conf.js

Escrevendo Testes​

Suponha que você tenha o seguinte componente Vue.js:

./components/Component.vue
<template>
<div>
<p>Times clicked: {{ count }}</p>
<button @click="increment">increment</button>
</div>
</template>

<script>
export default {
data: () => ({
count: 0,
}),

methods: {
increment() {
this.count++
},
},
}
</script>

No seu teste, renderize o componente no DOM e execute asserções nele. Recomendamos usar @vue/test-utils ou @testing-library/vue para anexar o componente à página de teste. Para interagir com o componente, use os comandos do WebdriverIO, pois eles se comportam de maneira mais próxima às interações reais do usuário, por exemplo:

vue.test.js
import { $, expect } from '@wdio/globals'
import { mount } from '@vue/test-utils'
import Component from './components/Component.vue'

describe('Vue Component Testing', () => {
it('increments value on click', async () => {
// The render method returns a collection of utilities to query your component.
const wrapper = mount(Component, { attachTo: document.body })
expect(wrapper.text()).toContain('Times clicked: 0')

const button = await $('aria/increment')

// Dispatch a native click event to our button element.
await button.click()
await button.click()

expect(wrapper.text()).toContain('Times clicked: 2')
await expect($('p=Times clicked: 2')).toExist() // same assertion with WebdriverIO
})
})

Você pode encontrar um exemplo completo de uma suíte de testes de componentes WebdriverIO para Vue.js em nosso repositório de exemplos.

Testando Componentes Assíncronos no Vue3​

Se você estiver usando Vue v3 e testando componentes assíncronos como o seguinte:

<script setup>
const res = await fetch(...)
const posts = await res.json()
</script>

<template>
{{ posts }}
</template>

Recomendamos usar @vue/test-utils e um pequeno wrapper de suspense para renderizar o componente. Infelizmente, @testing-library/vue ainda não tem suporte para isso. Crie um arquivo helper.ts com o seguinte conteúdo:

import { mount, type VueWrapper as VueWrapperImport } from '@vue/test-utils'
import { Suspense } from 'vue'

export type VueWrapper = VueWrapperImport<any>
const scheduler = typeof setImmediate === 'function' ? setImmediate : setTimeout

export function flushPromises(): Promise<void> {
return new Promise((resolve) => {
scheduler(resolve, 0)
})
}

export function wrapInSuspense(
component: ReturnType<typeof defineComponent>,
{ props }: { props: object },
): ReturnType<typeof defineComponent> {
return defineComponent({
render() {
return h(
'div',
{ id: 'root' },
h(Suspense, null, {
default() {
return h(component, props)
},
fallback: h('div', 'fallback'),
}),
)
},
})
}

export function renderAsyncComponent(vueComponent: ReturnType<typeof defineComponent>, props: object): VueWrapper{
const component = wrapInSuspense(vueComponent, { props })
return mount(component, { attachTo: document.body })
}

Então importe e teste o componente da seguinte forma:

import { $, expect } from '@wdio/globals'

import { renderAsyncComponent, flushPromises, type VueWrapper } from './helpers.js'
import AsyncComponent from '/components/SomeAsyncComponent.vue'

describe('Testing Async Components', () => {
let wrapper: VueWrapper

it('should display component correctly', async () => {
const props = {}
wrapper = renderAsyncComponent(AsyncComponent, { props })
await flushPromises()
await expect($('...')).toBePresent()
})

afterEach(() => {
wrapper.unmount()
})
})

Testando Componentes Vue no Nuxt​

Se você estiver usando o framework web Nuxt, o WebdriverIO ativará automaticamente o recurso de auto-importação e facilitará o teste de seus componentes Vue e páginas Nuxt. No entanto, qualquer módulo Nuxt que você defina em sua configuração e que requer contexto da aplicação Nuxt não pode ser suportado.

Razões para isso:

  • WebdriverIO não pode iniciar uma aplicação Nuxt somente em um ambiente de navegador
  • Ter testes de componentes que dependem muito do ambiente Nuxt cria complexidade e recomendamos executar esses testes como testes e2e
informação

O WebdriverIO também fornece um serviço para executar testes e2e em aplicações Nuxt, consulte webdriverio-community/wdio-nuxt-service para obter informações.

Mockando composables internos​

Caso seu componente use um composable nativo do Nuxt, como useNuxtData, o WebdriverIO automaticamente simulará essas funções e permitirá que você modifique seu comportamento ou faça asserções contra elas, por exemplo:

import { mocked } from '@wdio/browser-runner'

// e.g. your component uses calls `useNuxtData` the following way
// `const { data: posts } = useNuxtData('posts')`
// in your test you can assert against it
expect(useNuxtData).toBeCalledWith('posts')
// and change their behavior
mocked(useNuxtData).mockReturnValue({
data: [...]
})

Lidando com composables de terceiros​

Todos os módulos de terceiros que podem potencializar seu projeto Nuxt não podem ser automaticamente simulados. Nesses casos, você precisa simulá-los manualmente, por exemplo, se sua aplicação usa o módulo plugin Supabase:

export default defineNuxtConfig({
modules: [
"@nuxtjs/supabase",
// ...
],
// ...
});

e você cria uma instância do Supabase em algum lugar em seus composables, por exemplo:

const superbase = useSupabaseClient()

o teste falhará devido a:

ReferenceError: useSupabaseClient is not defined

Aqui, recomendamos simular todo o módulo que usa a função useSupabaseClient ou criar uma variável global que simule essa função, por exemplo:

import { fn } from '@wdio/browser-runner'
globalThis.useSupabaseClient = fn().mockReturnValue({})

Welcome! How can I help?

WebdriverIO AI Copilot