Skip to content

docs(ru): add Vuex 4.x translation #2205

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 25 commits into
base: main
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
docs(ru): update testing.md
  • Loading branch information
Amirzhan Aliyev committed Dec 27, 2022
commit 2998a1ff11f66475b8ce6c4795d61169981af40b
124 changes: 61 additions & 63 deletions docs/ru/guide/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,65 +6,65 @@

### Тестирование мутаций

Мутации тестировать довольно просто, так как они представляют из себя всего лишь простые функции, поведение которых полностью зависит от переданных параметров. Один трюк заключается в том, что если вы используете модули ES2015 и помещаете свои мутации в файле `store.js`, то помимо экспорта по умолчанию, вы должны экспортировать мутации с помощью именованного экспорта:
Мутации тестировать довольно просто, так как они представляют из себя всего лишь простые функции, поведение которых полностью зависит от переданных параметров. Один трюк заключается в том, что если использовать модули ES2015 и помещать мутации в файле `store.js`, то помимо экспорта по умолчанию, необходимо экспортировать мутации с помощью именованного экспорта:

```js
const state = { ... }

// именованный экспорт `mutations` отдельно от самого хранилища
export const mutations = { ... }

export default new Vuex.Store({
export default createStore({
state,
mutations
})
```

Пример тестирования мутаций с использованием Mocha + Chai (хотя вы не ограничены этими библиотеками и можете использовать любые другие):
Пример тестирования мутаций с использованием Mocha + Chai (хотя можно использовать и любые другие библиотеки):

```js
// mutations.js
export const mutations = {
increment: state => state.count++
};
}
```

```js
// mutations.spec.js
import { expect } from 'chai';
import { mutations } from './store';
import { expect } from 'chai'
import { mutations } from './store'

// деструктурирующее присваивание из `mutations`
const { increment } = mutations;
const { increment } = mutations

describe('mutations', () => {
it('INCREMENT', () => {
// фиксируем состояние
const state = { count: 0 };
const state = { count: 0 }
// применяем мутацию
increment(state);
increment(state)
// оцениваем результат
expect(state.count).to.equal(1);
});
});
expect(state.count).to.equal(1)
})
})
```

### Тестирование действий

Действия тестировать несколько сложнее, поскольку они могут обращаться ко внешним API. При тестировании действий обычно приходится заниматься подделкой внешних объектов — например, вызовы к API можно вынести в отдельный сервис, и в рамках тестов этот сервис подменить поддельным. Для упрощения имитации зависимостей можно использовать webpack и [inject-loader](https://github.com/plasticine/inject-loader) для сборки файлов тестов.
Действия тестировать несколько сложнее, поскольку они могут обращаться к внешним API. При тестировании действий обычно приходится заниматься подделкой внешних объектов — например, вызовы к API можно вынести в отдельный сервис, и в рамках тестов этот сервис подменить поддельным. Для упрощения имитации зависимостей можно использовать webpack и [inject-loader](https://github.com/plasticine/inject-loader) для сборки файлов тестов.

Пример тестирования асинхронного действия:

```js
// actions.js
import shop from '../api/shop';
import shop from '../api/shop'

export const getAllProducts = ({ commit }) => {
commit('REQUEST_PRODUCTS');
commit('REQUEST_PRODUCTS')
shop.getProducts(products => {
commit('RECEIVE_PRODUCTS', products);
});
};
commit('RECEIVE_PRODUCTS', products)
})
}
```

```js
Expand All @@ -73,52 +73,50 @@ export const getAllProducts = ({ commit }) => {
// для inline-загрузчиков используйте синтаксис require
// и inject-loader, возвращающий фабрику модулей, помогающую
// подменять зависимости
import { expect } from 'chai';
const actionsInjector = require('inject-loader!./actions');
import { expect } from 'chai'
const actionsInjector = require('inject-loader!./actions')

// создаём поддельную зависимость
const actions = actionsInjector({
'../api/shop': {
getProducts(cb) {
setTimeout(() => {
cb([
/* поддельный ответ от сервера */
]);
}, 100);
cb([/* поддельный ответ от сервера */])
}, 100)
}
}
});
})

// вспомогательная функция для тестирования действия, которое должно вызывать известные мутации
const testAction = (action, payload, state, expectedMutations, done) => {
let count = 0;
let count = 0

// поддельная функция вызова мутаций
const commit = (type, payload) => {
const mutation = expectedMutations[count];
const mutation = expectedMutations[count]

try {
expect(type).to.equal(mutation.type);
expect(payload).to.deep.equal(mutation.payload);
expect(type).to.equal(mutation.type)
expect(payload).to.deep.equal(mutation.payload)
} catch (error) {
done(error);
done(error)
}

count++;
count++
if (count >= expectedMutations.length) {
done();
done()
}
};
}

// вызываем действие с поддельным хранилищем и аргументами
action({ commit, state }, payload);
action({ commit, state }, payload)

// проверяем, были ли инициированы мутации
if (expectedMutations.length === 0) {
expect(count).to.equal(0);
done();
expect(count).to.equal(0)
done()
}
};
}

describe('actions', () => {
it('getAllProducts', done => {
Expand All @@ -136,32 +134,32 @@ describe('actions', () => {
}
],
done
);
});
});
)
})
})
```

Если у вас есть шпионы (spies), доступные в тестовой среде (например, через [Sinon.JS](http://sinonjs.org/)), вы можете использовать их вместо вспомогательной функции `testAction`:
Если есть шпионы (spies), доступные в тестовой среде (например, через [Sinon.JS](http://sinonjs.org/)), можно использовать их вместо вспомогательной функции `testAction`:

```js
describe('actions', () => {
it('getAllProducts', () => {
const commit = sinon.spy();
const state = {};
const commit = sinon.spy()
const state = {}

actions.getAllProducts({ commit, state });
actions.getAllProducts({ commit, state })

expect(commit.args).to.deep.equal([
['REQUEST_PRODUCTS'],
[
'RECEIVE_PRODUCTS',
{
/* mocked response */
/* поддельный ответ */
}
]
]);
});
});
])
})
})
```

### Тестирование геттеров
Expand All @@ -175,16 +173,16 @@ describe('actions', () => {
export const getters = {
filteredProducts(state, { filterCategory }) {
return state.products.filter(product => {
return product.category === filterCategory;
});
return product.category === filterCategory
})
}
};
}
```

```js
// getters.spec.js
import { expect } from 'chai';
import { getters } from './getters';
import { expect } from 'chai'
import { getters } from './getters'

describe('getters', () => {
it('filteredProducts', () => {
Expand All @@ -195,25 +193,25 @@ describe('getters', () => {
{ id: 2, title: 'Orange', category: 'fruit' },
{ id: 3, title: 'Carrot', category: 'vegetable' }
]
};
}
// поддельный параметр геттера
const filterCategory = 'fruit';
const filterCategory = 'fruit'

// получаем результат выполнения тестируемого геттера
const result = getters.filteredProducts(state, { filterCategory });
const result = getters.filteredProducts(state, { filterCategory })

// проверяем результат
expect(result).to.deep.equal([
{ id: 1, title: 'Apple', category: 'fruit' },
{ id: 2, title: 'Orange', category: 'fruit' }
]);
});
});
])
})
})
```

### Запуск тестов

Если вы должным образом соблюдаете правила написания мутаций и действий, результирующие тесты не должны зависеть от API браузера. Поэтому их можно просто собрать webpack'ом и запустить в Node. С другой стороны, можно использовать `mocha-loader` или Karma + `karma-webpack`, и запускать тесты в реальных браузерах.
Если должным образом соблюдаете правила написания мутаций и действий, результирующие тесты не должны зависеть от API браузера. Поэтому их можно просто собрать webpack'ом и запустить в Node. С другой стороны, можно использовать `mocha-loader` или Karma + `karma-webpack`, и запускать тесты в реальных браузерах.

#### Запуск в Node

Expand All @@ -236,7 +234,7 @@ module.exports = {
}
]
}
};
}
```

Затем в терминале:
Expand All @@ -246,13 +244,13 @@ webpack
mocha test-bundle.js
```

#### Запуск в браузерах
### Запуск в браузерах

1. Установите `mocha-loader`
2. Измените `entry` в приведённой выше конфигурации Webpack на `'mocha-loader!babel-loader!./test.js'`.
3. Запустите `webpack-dev-server`, используя эту конфигурацию
4. Откройте в браузере `localhost:8080/webpack-dev-server/test-bundle`.

#### Запуск в браузерах при помощи Karma и karma-webpack
### Запуск в браузерах при помощи Karma и karma-webpack

Обратитесь к [документации vue-loader](https://vue-loader.vuejs.org/ru/workflow/testing.html).