API

mount()

  • Принимает:

    • {Component} component
    • {Object} options
  • Возвращает: {Wrapper}

  • Опции:

См. опции монтирования

  • Использование:

Создаёт Wrapper, который содержит примонтированный и отрендеренный компонент Vue.

Без опций:

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)
  })
})

С опциями 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')
  })
})

Прикрепление к DOM:

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

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

Слот по умолчанию и именованные слоты:

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, // будет соответствовать `<slot name="FooBar" />`
        foo: '<div />'
      }
    })
    expect(wrapper.contains('div')).toBe(true)
  })
})

Заглушки глобальных свойств:

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)
  })
})

Заглушки компонентов:

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: {
        Bar: '<div class="stubbed" />',
        BarFoo: true,
        FooBar: Faz
      }
    })
    expect(wrapper.contains('.stubbed')).toBe(true)
    expect(wrapper.contains(Bar)).toBe(true)
  })
})

shallowMount()

  • Принимает:

    • {Component} component
    • {Object} options
      • {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
  • Возвращает: {Wrapper}

  • Опции:

См. опции монтирования

  • Использование:

Аналогично mount, создаёт Wrapper, который содержит примонтированный и отрендеренный компонент Vue, но с заглушками вместо дочерних компонентов.

Без опций:

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

describe('Foo', () => {
  it('отрендерить div', () => {
    const wrapper = shallowMount(Foo)
    expect(wrapper.contains('div')).toBe(true)
  })
})

С опциями Vue:

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

describe('Foo', () => {
  it('отрендерить div', () => {
    const wrapper = shallowMount(Foo, {
      propsData: {
        color: 'red'
      }
    })
    expect(wrapper.props().color).toBe('red')
  })
})

Прикрепление к DOM:

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

describe('Foo', () => {
  it('отрендерить div', () => {
    const wrapper = shallowMount(Foo, {
      attachToDocument: true
    })
    expect(wrapper.contains('div')).toBe(true)
  })
})

Слот по умолчанию и именованные слоты:

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

describe('Foo', () => {
  it('отрендерить div', () => {
    const wrapper = shallowMount(Foo, {
      slots: {
        default: [Bar, FooBar],
        fooBar: FooBar, // будет соответствовать <slot name="FooBar" />,
        foo: '<div />'
      }
    })
    expect(wrapper.contains('div')).toBe(true)
  })
})

Заглушки глобальных свойств:

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

describe('Foo', () => {
  it('отрендерить div', () => {
    const $route = { path: 'http://www.example-path.com' }
    const wrapper = shallowMount(Foo, {
      mocks: {
        $route
      }
    })
    expect(wrapper.vm.$route.path).toBe($route.path)
  })
})

render()

  • Принимает:

    • {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
  • Возвращает: {CheerioWrapper}

  • Опции:

См. опции

  • Использование:

Рендерит объект в строку и возвращает обёртку cheerio.

Cheerio — библиотека, похожая на jQuery, для навигации по DOM в Node.js. Она имеет аналогичный API в Wrapper Vue Test Utils.

render использует vue-server-renderer под капотом для рендеринга компонента в статический HTML.

render включён в пакет @vue/server-test-utils.

Без опций:

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

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

С опциями Vue:

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

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

Слоты по умолчанию и именованные слоты:

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', () => {
    const wrapper = render(Foo, {
      slots: {
        default: [Bar, FooBar],
        fooBar: FooBar, // Будет соответствовать <slot name="FooBar" />,
        foo: '<div />'
      }
    })
    expect(wrapper.text()).toContain('<div></div>')
  })
})

Создание заглушек глобальных свойств:

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

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

renderToString()

  • Аргументы:

    • {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
  • Возвращает: {string}

  • Опции:

См. опции

  • Использование:

Рендерит компонент в HTML.

renderToString использует vue-server-renderer под капотом для рендеринга компонента в статический HTML.

renderToString включён в пакет @vue/server-test-utils.

Без опций:

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

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

С опциями Vue:

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

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

С слотами по умолчанию и именованными слотами:

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', () => {
    const renderedString = renderToString(Foo, {
      slots: {
        default: [Bar, FooBar],
        fooBar: FooBar, // Будет соответствовать <slot name="FooBar" />,
        foo: '<div />'
      }
    })
    expect(renderedString).toContain('<div></div>')
  })
})

Создание заглушек глобальных свойств:

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

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

Селекторы

Многие методы принимают селектор в качестве аргумента. Селектором может быть CSS селектор, компонент Vue или опция поиска объекта.

CSS-селекторы

Обрабатывают любой допустимый CSS селектор:

  • селекторы тегов (div, foo, bar)
  • селекторы классов (.foo, .bar)
  • селекторы атрибутов ([foo], [foo="bar"])
  • селекторы id (#foo, #bar)
  • селекторы псевдо-элементов (div:first-of-type)

Вы также можете использовать комбинации:

  • выбор только непосредственных потомков (div > #bar > .foo)
  • выбор элементов, являющихся потомками (div #bar .foo)
  • селектор выбора соседа идущего за элементом (div + .foo)
  • селектор выбора соседей идущих после элемента (div ~ .foo)

Компоненты Vue

Компоненты Vue также являются корректными селекторами.

// 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)

Опция поиска объекта

Name

Использование объекта для опции поиска, позволяет Vue Test Utils выбирать элементы по name компонента на компонентах обёртках.

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

Ref

Использование опции поиска объекта позволяет Vue Test Utils выбирать элементы по $ref на компонентах обёрток.

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

createLocalVue()

  • Возвращает:

    • {Component}
  • Использование:

createLocalVue возвращает класс Vue, чтобы вы могли добавлять компоненты, примеси и устанавливать плагины без загрязнения глобального класса Vue.

Используйте вместе с options.localVue:

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

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

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

Конфигурация

Vue Test Utils включает объект конфигурации для определения опций, используемых Vue Test Utils.

Конфигурация настроек Vue Test Utils

stubs

  • Тип: { [name: string]: Component | boolean | string }
  • По умолчанию: { transition: TransitionStub, 'transition-group': TransitionGroupStub }

Заглушки указанные в config.stubs используются по умолчанию. Заглушки, используемые в компонентах. Они перезаписываются значениями stubs переданными в настройках монтирования.

При передаче stubs в качестве массива в настройках монтирования, config.stubs будет преобразована в массив, и будут создаваться компоненты заглушки с базовым компонентом, который возвращает <${component name}-stub>.

Пример:

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

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

mocks

  • Тип: Object
  • По умолчанию: {}

По аналогии с stubs, значения, переданные в config.mocks используются по умолчанию. Любые значения, переданные настройкам монтирования объекта mocks, будут иметь приоритет выше, по сравнению с объявленными в config.mocks.

Пример:

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

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

methods

  • Тип: { [name: string]: Function }
  • По умолчанию: {}

Вы можете настроить методы по умолчанию с помощью объекта config. Это может быть полезно для плагинов, которые вводят методы в компоненты, такие как VeeValidate. Вы можете переопределить методы, установленные в config, передав methods в настройках монтирования.

Пример:

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

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

provide

  • Тип: Object
  • По умолчанию: {}

Как stubs или mocks, значения, переданные config.provide, используются по умолчанию. Любые значения, переданные настройкам монтирования объекта provide, будут иметь приоритет выше по сравнению с объявленными в config.provide. Обратите внимание, что не поддерживается передача функции в качестве config.provide.

Пример:

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

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

logModifiedComponents

  • Тип: Boolean
  • По умолчанию: true

Логирует о предупреждениях, когда для расширенных дочерних компонентов автоматически создаётся заглушка. Скрывает предупреждения, когда установлено значение false. В отличие от других опций конфигурации, это невозможно установить в настройках монтирования.

Пример:

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

config.logModifiedComponents = false

silent

  • Тип: Boolean
  • По умолчанию: true

Подавляет предупреждения, вызванные Vue во время изменения наблюдаемых компонентов (например, входных параметров). Если установлено значение false, все предупреждения показываются в консоли. Это настраиваемый способ, который основывается на Vue.config.silent.

Пример:

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

config.silent = false