From 4f3ce4bcf7cec38739352f91926033adf88f0d9e Mon Sep 17 00:00:00 2001 From: denis moshkin Date: Thu, 23 Jan 2025 12:15:14 +0300 Subject: [PATCH] add `migration` page --- docs/ru/migration/index.md | 390 +++++++++++++++++++++++++++++++++++++ 1 file changed, 390 insertions(+) create mode 100644 docs/ru/migration/index.md diff --git a/docs/ru/migration/index.md b/docs/ru/migration/index.md new file mode 100644 index 000000000..a5ac68553 --- /dev/null +++ b/docs/ru/migration/index.md @@ -0,0 +1,390 @@ +# Миграция с Vue Test Utils v1 + +Обзор изменений VTU v1 -> VTU v2 и некоторых фрагментов кода, которые демонстрируют необходимые изменения. Если вы столкнулись с багом или отличием в поведение, не документированном здесь, пожалуйста [откройте issue](https://github.com/vuejs/test-utils/issues/new). + +## Изменения + +### `propsData` теперь `props` + +В VTU v1, вы могли бы передать `props`, используя опцию монтирования `propsData`. Это сбивало с толку, потому что вы объявляли свойства внутри `props` параметра в ваших Vue компонентах. Теперь вы можете передавать `props`, используя опцию монтирования `props`. `propsData` есть и будет продолжать поддерживаться для обратной совместимости. + +**До**: + +```js +const App = { + props: ['foo'] +} + +const wrapper = mount(App, { + propsData: { + foo: 'bar' + } +} +``` + +**После**: + +```js +const App = { + props: ['foo'] +} + +const wrapper = mount(App, { + props: { + foo: 'bar' + } +} +``` + +### Больше нет `createLocalVue` + +Во Vue 2 это было распространенным для плагинов, чтобы изменять глобальный Vue экземпляр и прикреплять различные методы к прототипу. Начиная с Vue 3, такой вариант не нужен, потому что вы создаете новое Vue приложение, используя `createApp` вместо `new Vue`, и устанавливаете плагины с помощью `createApp(App).use(/* ... */)`. + +Для избежания загрязнения глобального Vue экземпляром в Vue Test Utils v1 мы предоставили `createLocalVue` функцию и опцию монтирования `localVue`. Это должно было позволить вам иметь изолированный Vue экземпляр для каждого теста, избегая перекрестного загрязнения. Теперь это не проблема в Vue 3, поскольку плагины, миксины и т. д. не изменяют глобальный Vue экземпляр. + +Для большинства вариантов, где вы ранее использовали бы `createLocalVue` и опцию монтирования `localVue` для установки плагина, миксина или директивы, теперь вы можете использовать [`global` опцию монтирования](/api/#global-components). Здесь пример компонента и теста, которые используют `localVue`, и как это выглядит сейчас (используя `global.plugins`, поскольку Vuex это плагин): + +**До**: + +```js +import Vuex from 'vuex' +import { createLocalVue, mount } from '@vue/test-utils' + +const App = { + computed: { + count() { + return this.$state.count + } + } +} + +const localVue = createLocalVue() +localVue.use(Vuex) +const store = new Vuex.Store({ + state: { + return { count: 1 } + } +}) + +const wrapper = mount(App, { + store + localVue +}) +``` + +**После**: + +```js +import { createStore } from 'vuex' +import { mount } from '@vue/test-utils' + +const App = { + computed: { + count() { + return this.$state.count + } + } +} + +const store = createStore({ + state() { + return { count: 1 } + } +}) + +const wrapper = mount(App, { + global: { + plugins: [store] + } +}) +``` + +### `mocks` и `stubs` теперь в `global` + +`mocks` и `stubs` применяются ко всем компонентам, не только к тому, который ты передаешь в `mount`. Чтобы отразить это, `mocks` и `stubs` находятся в опции монтирования `global`: + +**До**: + +```js +const $route = { + params: { + id: '1' + } +} + +const wrapper = mount(App, { + stubs: { + Foo: true + }, + mocks: { + $route + } +} +``` + +**После**: + +```js +const $route = { + params: { + id: '1' + } +} + +const wrapper = mount(App, { + global: { + stubs: { + Foo: true + }, + mocks: { + $route + } + } +} +``` + +### `shallowMount` и `renderStubDefaultSlot` + +`shallowMount` предназначался для заглушки любых пользовательских компонентов. Хотя это и имело место быть в Vue Test Utils v1, заглушенные компоненты все еще отрисовывали их стандартный ``. Хотя это было не предусмотрено, некоторые пользователям эта функция понравилась. Это поведение было исправлено в v2 - **содержимое слота для заглушенного компонента не отрисовывается**. + +Дается такой код: + +```js +import { shallowMount } from '@vue/test-utils' + +const Foo = { + template: `
` +} + +const App = { + components: { Foo }, + template: ` +
+ + Foo Slot + +
+ ` +} +``` + +**До**: + +```js +describe('App', () => { + it('renders', () => { + const wrapper = shallowMount(App) + console.log(wrapper.html()) + // renders: + //
+ // + // Foo Slot + // + //
+ }) +}) +``` + +**После**: + +```js +describe('App', () => { + it('renders', () => { + const wrapper = shallowMount(App) + console.log(wrapper.html()) + // renders: + //
+ // + // + //
+ }) +}) +``` + +Вы можете включить старое поведение примерно так: + +```js +import { config } from '@vue/test-utils' + +config.global.renderStubDefaultSlot = true +``` + +### `destroy` теперь `unmount` для соответствия с Vue 3 + +Vue 3 переименовал `vm.$destroy` в `vm.$unmount`. Vue Test Utils последовал этому примеру; `wrapper.destroy()` теперь `wrapper.unmount()`. + +### `scopedSlots` теперь объединены с `slots` + +Vue 3 объединил `slot` и `scoped-slot` синтаксис в один `v-slot`, о котором вы можете прочитать в [документации](https://v3.vuejs.org/guide/migration/slots-unification.html#overview). Поскольку `slot` и `scoped-slot` объединены, опция монтирования `scopedSlots` теперь устарела, просто используйте опцию монтирования `slots` для всего. + +### `slots` scope предоставляется как `params` + +При использовании шаблонов строк для содержимого слота, если явно не определен тэг обертка `