You’re browsing the documentation for Vue Test Utils for Vue v2.x and earlier.

To read docs for Vue Test Utils for Vue 3, click here.

API

O método mount()

  • Argumentos:

    • {Component} component
    • {Object} options
  • Retorna: {Wrapper}

  • Opções:

Consulte as opções

  • Uso:

Cria um Wrapper (envolvedor) que contém o componente Vue montado e renderizado.

Sem as opções:

import { mount } from '@vue/test-utils'
import Foo from './Foo.vue'

describe('Foo', () => {
  it('renders a div', () => {
    const wrapper = mount(Foo)
    expect(wrapper.contains('div')).toBe(true)
  })
})

Com as opções do Vue:

import { mount } from '@vue/test-utils'
import Foo from './Foo.vue'

describe('Foo', () => {
  it('renders a div', () => {
    const wrapper = mount(Foo, {
      propsData: {
        color: 'red'
      }
    })
    expect(wrapper.props().color).toBe('red')
  })
})

Ligar ao DOM:

import { mount } from '@vue/test-utils'
import Foo from './Foo.vue'

describe('Foo', () => {
  it('renders a div', () => {
    const div = document.createElement('div')
    document.body.appendChild(div)
    const wrapper = mount(Foo, {
      attachTo: div
    })
    expect(wrapper.contains('div')).toBe(true)
    wrapper.destroy()
  })
})

Encaixes padrão e nomeados:

import { mount } from '@vue/test-utils'
import Foo from './Foo.vue'
import Bar from './Bar.vue'
import FooBar from './FooBar.vue'

describe('Foo', () => {
  it('renders a div', () => {
    const wrapper = mount(Foo, {
      slots: {
        default: [Bar, FooBar],
        fooBar: FooBar, // Corresponderá a `<slot name="FooBar" />`.
        foo: '<div />'
      }
    })
    expect(wrapper.contains('div')).toBe(true)
  })
})

Forjando propriedades globais:

import { mount } from '@vue/test-utils'
import Foo from './Foo.vue'

describe('Foo', () => {
  it('renders a div', () => {
    const $route = { path: 'http://www.example-path.com' }
    const wrapper = mount(Foo, {
      mocks: {
        $route
      }
    })
    expect(wrapper.vm.$route.path).toBe($route.path)
  })
})

Forjando componentes:

import { mount } from '@vue/test-utils'
import Foo from './Foo.vue'
import Bar from './Bar.vue'
import Faz from './Faz.vue'

describe('Foo', () => {
  it('renders a div', () => {
    const wrapper = mount(Foo, {
      stubs: {
        BarFoo: true,
        FooBar: Faz,
        Bar: { template: '<div class="stubbed" />' }
      }
    })
    expect(wrapper.contains('.stubbed')).toBe(true)
    expect(wrapper.contains(Bar)).toBe(true)
  })
})

Nota de Depreciação:

Quando você estiver forjando componentes, o fornecimento de uma string (ComponentToStub: '<div class="stubbed" />) já não é suportado.

O método shallowMount()

  • Argumentos:

    • {Component} component
    • {Object} options
      • {HTMLElement|string} string
      • {boolean} attachToDocument
      • {Object} context
        • {Array<Component|Object>|Component} children
      • {Object} slots
        • {Array<Component|Object>|Component|String} default
        • {Array<Component|Object>|Component|String} named
      • {Object} mocks
      • {Object|Array<string>} stubs
      • {Vue} localVue
  • Retorna: {Wrapper}

  • Opções:

Consulte as opções

  • Uso:

Tal como o mount, ele cria um Wrapper (envolvedor) que contém o componente Vue montado e renderizado, mas com componentes filhos forjados.

Sem as opções:

import { shallowMount } from '@vue/test-utils'
import Foo from './Foo.vue'

describe('Foo', () => {
  it('renders a div', () => {
    const wrapper = shallowMount(Foo)
    expect(wrapper.contains('div')).toBe(true)
  })
})

Com as opções do Vue:

import { shallowMount } from '@vue/test-utils'
import Foo from './Foo.vue'

describe('Foo', () => {
  it('renders a div', () => {
    const wrapper = shallowMount(Foo, {
      propsData: {
        color: 'red'
      }
    })
    expect(wrapper.props().color).toBe('red')
  })
})

Ligar ao DOM:

import { shallowMount } from '@vue/test-utils'
import Foo from './Foo.vue'

describe('Foo', () => {
  it('renders a div', () => {
    const div = document.createElement('div')
    document.body.appendChild(div)
    const wrapper = shallowMount(Foo, {
      attachTo: div
    })
    expect(wrapper.contains('div')).toBe(true)
    wrapper.destroy()
  })
})

Encaixes padrão e nomeados:

import { shallowMount } from '@vue/test-utils'
import Foo from './Foo.vue'
import Bar from './Bar.vue'
import FooBar from './FooBar.vue'

describe('Foo', () => {
  it('renders a div', () => {
    const wrapper = shallowMount(Foo, {
      slots: {
        default: [Bar, FooBar],
        fooBar: FooBar, // Corresponderá a <slot name="FooBar" />,
        foo: '<div />'
      }
    })
    expect(wrapper.contains('div')).toBe(true)
  })
})

Forjando propriedades globais:

import { shallowMount } from '@vue/test-utils'
import Foo from './Foo.vue'

describe('Foo', () => {
  it('renders a div', () => {
    const $route = { path: 'http://www.example-path.com' }
    const wrapper = shallowMount(Foo, {
      mocks: {
        $route
      }
    })
    expect(wrapper.vm.$route.path).toBe($route.path)
  })
})

O método render()

  • Argumentos:

    • {Component} component
    • {Object} options
      • {Object} context
        • {Array<Component|Object>|Component} children
      • {Object} slots
        • {Array<Component|Object>|Component|String} default
        • {Array<Component|Object>|Component|String} named
      • {Object} mocks
      • {Object|Array<string>} stubs
      • {Vue} localVue
  • Retorna: {Promise<CheerioWrapper>}

  • Opções:

Consulte as opções

  • Uso:

Transforma um objeto em uma string e retorna um cheerio wrapper (envolvedor).

Cheerio é uma biblioteca parecida com o JQuery para atravessar o DOM dentro do Node.js. Ela tem uma API semelhante ao Wrapper (envolvedor) da Vue Test Utils.

O render usa vue-server-renderer nos bastidores, para transformar um componente em HTML estático.

O render está incluído dentro do pacote @vue/server-test-utils.

Sem as opções:

import { render } from '@vue/server-test-utils'
import Foo from './Foo.vue'

describe('Foo', () => {
  it('renders a div', async () => {
    const wrapper = await render(Foo)
    expect(wrapper.text()).toContain('<div></div>')
  })
})

Com as opções do Vue:

import { render } from '@vue/server-test-utils'
import Foo from './Foo.vue'

describe('Foo', () => {
  it('renders a div', async () => {
    const wrapper = await render(Foo, {
      propsData: {
        color: 'red'
      }
    })
    expect(wrapper.text()).toContain('red')
  })
})

Encaixes padrão e nomeados:

import { render } from '@vue/server-test-utils'
import Foo from './Foo.vue'
import Bar from './Bar.vue'
import FooBar from './FooBar.vue'

describe('Foo', () => {
  it('renders a div', async () => {
    const wrapper = await render(Foo, {
      slots: {
        default: [Bar, FooBar],
        fooBar: FooBar, // Corresponderá a <slot name="FooBar" />,
        foo: '<div />'
      }
    })
    expect(wrapper.text()).toContain('<div></div>')
  })
})

Forjando propriedades globais:

import { render } from '@vue/server-test-utils'
import Foo from './Foo.vue'

describe('Foo', () => {
  it('renders a div', async () => {
    const $route = { path: 'http://www.example-path.com' }
    const wrapper = await render(Foo, {
      mocks: {
        $route
      }
    })
    expect(wrapper.text()).toContain($route.path)
  })
})

O método renderToString()

  • Argumentos:

    • {Component} component
    • {Object} options
      • {Object} context
        • {Array<Component|Object>|Component} children
      • {Object} slots
        • {Array<Component|Object>|Component|String} default
        • {Array<Component|Object>|Component|String} named
      • {Object} mocks
      • {Object|Array<string>} stubs
      • {Vue} localVue
  • Retorna: {Promise<string>}

  • Opções:

Consulte as opções

  • Uso:

Transforma um componente em HTML.

O renderToString usa o vue-server-renderer nos bastidores, para transformar um componente em HTML.

O renderToString está incluído dentro do pacote @vue/server-test-utils.

Sem as opções:

import { renderToString } from '@vue/server-test-utils'
import Foo from './Foo.vue'

describe('Foo', () => {
  it('renders a div', async () => {
    const str = await renderToString(Foo)
    expect(str).toContain('<div></div>')
  })
})

Com as opções do Vue:

import { renderToString } from '@vue/server-test-utils'
import Foo from './Foo.vue'

describe('Foo', () => {
  it('renders a div', async () => {
    const str = await renderToString(Foo, {
      propsData: {
        color: 'red'
      }
    })
    expect(str).toContain('red')
  })
})

Encaixes padrão e nomeados:

import { renderToString } from '@vue/server-test-utils'
import Foo from './Foo.vue'
import Bar from './Bar.vue'
import FooBar from './FooBar.vue'

describe('Foo', () => {
  it('renders a div', async () => {
    const str = await renderToString(Foo, {
      slots: {
        default: [Bar, FooBar],
        fooBar: FooBar, // Corresponderá a <slot name="FooBar" />,
        foo: '<div />'
      }
    })
    expect(str).toContain('<div></div>')
  })
})

Forjando propriedades globais:

import { renderToString } from '@vue/server-test-utils'
import Foo from './Foo.vue'

describe('Foo', () => {
  it('renders a div', async () => {
    const $route = { path: 'http://www.example-path.com' }
    const str = await renderToString(Foo, {
      mocks: {
        $route
      }
    })
    expect(str).toContain($route.path)
  })
})

Os seletores

Há muitos métodos que recebem um seletor como um argumento. Um seletor pode ser tanto um seletor CSS, um componente do Vue, ou um método find de objeto.

Seletores CSS

O mount manipula qualquer seletor css válido:

  • seletores de tags (div, foo, bar)
  • seletores de classe (.foo, .bar)
  • seletores de atributos ([foo], [foo="bar"])
  • seletores de id (#foo, #bar)
  • pseudo-seletores (div:first-of-type)

You can also use combinators: Você também pode usar combinações:

  • combinador de descendente direto (div > #bar > .foo)
  • combinador de descendente genérico (div #bar .foo)
  • seletor de irmão adjacente (div + .foo)
  • seletor de irmão genérico (div ~ .foo)

Componentes do Vue

Os componentes do Vue também são seletores válidos.

// Foo.vue

export default {
  name: 'FooComponent'
}
import { shallowMount } from '@vue/test-utils'
import Foo from './Foo.vue'

const wrapper = shallowMount(Foo)
expect(wrapper.is(Foo)).toBe(true)

Método Find de Objeto

Name (nome)

Ao usar um método find de objeto, o Vue Test Utils permite a seleção de elementos pelo name do componente no wrapper (envolvedor) de componentes.

const buttonWrapper = wrapper.find({ name: 'my-button' })
buttonWrapper.trigger('click')

Ref (referência)

Ao usar um método find de objeto, o Vue Test Utils permite a seleção de elementos pelo $ref no wrapper (envolvedor) de componentes.

const buttonWrapper = wrapper.find({ ref: 'myButton' })
buttonWrapper.trigger('click')

O método createLocalVue()

  • Argumentos:

    • {Object} options
      • {Function} errorHandler
  • Retorna:

    • {Component}
  • Uso:

O createLocalVue retorna uma classe do Vue para você adicionar componentes, mixins (combinadores) e instalar plugins sem poluir a classe global do Vue.

A opção errorHandler pode ser usada para manipular erros não capturados durante a função de renderizar do componente e observadores.

Use ele com options.localVue:

Sem as opções:

import { createLocalVue, shallowMount } from '@vue/test-utils'
import MyPlugin from 'my-plugin'
import Foo from './Foo.vue'

const localVue = createLocalVue()
localVue.use(MyPlugin)
const wrapper = shallowMount(Foo, {
  localVue,
  mocks: { foo: true }
})
expect(wrapper.vm.foo).toBe(true)

const freshWrapper = shallowMount(Foo)
expect(freshWrapper.vm.foo).toBe(false)

Com a opção errorHandler:

import { createLocalVue, shallowMount } from '@vue/test-utils'
import Foo from './Foo.vue'

const errorHandler = (err, vm, info) => {
  expect(err).toBeInstanceOf(Error)
}

const localVue = createLocalVue({
  errorHandler
})

// Foo lança um erro dentro um gatilho do ciclo de vida
const wrapper = shallowMount(Foo, {
  localVue
})

O método createWrapper(node [, options])

  • Argumentos:

    • {vm|HTMLElement} node
    • {Object} options
      • {Boolean} attachedToDocument
  • Retorna:

    • {Wrapper}
  • Uso:

O createWrapper cria um Wrapper para uma instância do Vue montada, ou um elemento HTML.

import { createWrapper } from '@vue/test-utils'
import Foo from './Foo.vue'

const Constructor = Vue.extend(Foo)
const vm = new Constructor().$mount()
const wrapper = createWrapper(vm)
expect(wrapper.vm.foo).toBe(true)

Configuração

A Vue Test Utils incluem um objeto de configuração para as opções definidas usadas pela Vue Test Utils.

Opções de Configuração da Vue Test Utils

showDeprecationWarnings

  • tipo: Boolean
  • valor padrão: true

Controla se ou não mostrar avisos de depreciação. Quando definida para true, todos avisos de depreciação são visíveis na consola.

Exemplo:

import { config } from '@vue/test-utils'

config.showDeprecationWarnings = false

deprecationWarningHandler

  • tipo: Function

Permite controle delicado sobre os avisos de depreciação. Quando showDeprecationWarnings é definido para true, todos avisos de depreciação serão passados para este manipulador com o nome do método como primeiro argumento e a mensagem original como segundo argumento.

TIP

Isto poderia ser útil para registar mensagens de depreciação para separar a localização ou ajudar numa atualização gradual de base de código para última versão do utilitários de teste pela ignorância de certas funções de avisos depreciadas

Exemplo:

import { config } from '@vue/test-utils'

config.showDeprecationWarnings = true
config.deprecationWarningHandler = (method, message) => {
  if (method === 'emittedByOrder') return

  console.error(message)
}

stubs

  • tipo: { [name: string]: Component | boolean | string }
  • valor padrão: {}

O forjado guardado dentro de config.stubs é usado por padrão. Forjados para usar dentro de componentes. Estes são sobrescritos pelo stubs passado dentro das opções em montagem.

Quando estiver passando stubs como um arranjo dentro de opções em montagem, os config.stubs são convertidos para um arranjo, e forjarão componentes com um componente básico que retornam <${component name}-stub>.

Exemplo:

import { config } from '@vue/test-utils'

config.stubs['my-component'] = '<div />'

mocks

  • tipo: Object
  • valor padrão: {}

Tal como nos stubs, os valores passados para o config.mocks são usados por padrão. Quaisquer valores passados para as opções de montagem do objeto mocks terão prioridade sobre aqueles declarados dentro de config.mocks.

Exemplo:

import { config } from '@vue/test-utils'

config.mocks['$store'] = {
  state: {
    id: 1
  }
}

methods

  • tipo: { [name: string]: Function }
  • valor padrão: {}

Você pode configurar métodos padrão usando o objeto config. Isto podem ser útil para plugins que injetam métodos aos componentes, tal como o VeeValidate. Você pode sobrescrever métodos definidos dentro de config ao passar os methods dentro das opções em montagem.

Exemplo:

import { config } from '@vue/test-utils'

config.methods['getData'] = () => {}

provide

  • tipo: Object
  • valor padrão: {}

Tal como em stubs ou mocks, os valores passados para o config.provide são usados por padrão. Quaisquer valores passados para opções em montagem do objeto provide terão prioridade sobre aqueles declarados dentro de config.provide. Por favor repare que isto não é suportado para passar uma função como config.provide.

Exemplo:

import { config } from '@vue/test-utils'

config.provide['$logger'] = {
  log: (...args) => {
    console.log(...args)
  }
}

O método enableAutoDestroy(hook)

  • Argumentos:

    • {Function} hook
  • Uso:

O método enableAutoDestroy destruirá todas as instâncias de Wrapper (envolvedor) usando a função gatilho passada (por exemplo o afterEach). Depois de chamar o método, você pode reverter para o comportamento padrão ao chamar o método resetAutoDestroyState.

import { enableAutoDestroy, mount } from '@vue/test-utils'
import Foo from './Foo.vue'

// chama wrapper.destroy() depois de cada teste
enableAutoDestroy(afterEach)

describe('Foo', () => {
  it('renders a div', () => {
    const wrapper = mount(Foo)
    expect(wrapper.contains('div')).toBe(true)
    // não há necessidade de chamar wrapper.destroy() aqui
  })
})

A função resetAutoDestroyState

  • Uso:

Depois de chamar enableAutoDestroy você pode precisar desativar o comportamento de autodestruição (por exemplo quando algum do seu conjunto de testes depender do wrapper (envolvedor) ser persistente através de testes separados)

Para alcançar isso você pode chamar resetAutoDestroyState para desativar o gatilho registado anteriormente

import {
  enableAutoDestroy,
  resetAutoDestroyState,
  mount
} from '@vue/test-utils'
import Foo from './Foo.vue'

// chama wrapper.destroy() depois de cada teste
enableAutoDestroy(afterEach)
// redefine a autodestruição depois do conjunto terminar
afterAll(resetAutoDestroyState)

describe('Foo', () => {
  it('renders a div', () => {
    const wrapper = mount(Foo)
    expect(wrapper.contains('div')).toBe(true)
    // não há necessidade de chamar wrapper.destroy() aqui
  })
})