Тестирование Vue Components - Mocking State и методы
Я пытался разобраться в модульном тестировании vue компонентов, но я не могу понять, как создать макет /Stub хранилища объектов и методов, которые вызывают API-асинхронность.
Это пример компонента vue, который мы имеем:
import { mapState, mapGetters } from 'vuex'
import router from 'components/admin/router'
export default {
name: 'Users',
computed: {
...mapState('admin', [
'users',
]),
...mapGetters({
requestInProgress: 'requestInProgress',
}),
},
data: function() {
return {
filterTerm: '',
usersLoaded: false,
}
},
methods: {
filterUsers(filter) {
this.$store.dispatch('admin/getUserList', filter)
.then(res => {
this.usersLoaded = true
})
.catch(e => {
this.$toast.error({
title: 'Failed to retrieve data',
message: this.$options.filters.normaliseError(e),
})
})
},
},
mounted() {
this.getUsers('*')
},
}
И это тест, который я хочу написать. Я даже не могу заставить тест работать чисто, не пытаясь на самом деле утверждать что-либо
import Vue from 'vue'
import { shallowMount } from '@vue/test-utils'
import Users from 'components/admin/pages/user/users.vue'
describe('Users Vue', () => {
it('Page Should Load', () => {
const mockResponse = {
data: [{
"id": "1",
"emailAddress": "beakersoft@gmail.com",
"firstName": "Luke",
"lastName": "Niland",
"staffNumber": "12345",
"phoneNumber": "07707 999999",
"active": true
}
]};
let actions
let store
beforeEach(() => {
actions = {
'admin/getUserList': sinon.stub()
.returns(Promise.resolve(mockResponse))
}
store = new Vuex.Store({
state: {},
actions
})
})
const wrapper = shallowMount(Users, { store })
const h5 = wrapper.find('h5')
expect(h5.text()).toBe('User Administration')
})
})
Ошибки, которые я обычно получаю, связаны с неопределенностью элементов, обычно в этом случае $ store.dispatch не определен. Я чувствую, что я что-то упускаю из-за насмешек, или тот факт, что getUsers() вызывается при монтировании, отключает его
0 ответов
Для того, чтобы протестировать компонент Vue, имитирующий Vuex, как вы делаете в своем примере, можно пройти макет store
Vue, когда вы shallowMount
Ваш компонент, как вы делаете, так:
shallowMount(Users, { store })
но это издевательство store
необходимо также установить на базовый конструктор Vue. Для этого вы должны передать его - localVue
, localVue
является конструктором Vue с областями видимости, в который вы можете вносить изменения в области тестирования, не влияя на глобальный конструктор Vue, фактически используемый в вашем приложении.
Более того, в вашем конкретном случае вы не импортировали и не устанавливали Vuex.
Затем, чтобы правильно настроить тест, вам необходимо:
- создать
localVue
экземпляр, вызвав утилиту Vue Test UtilscreateLocalVue
Функционируем и устанавливаем на него Vuex:
import { shallowMount, createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex'
//creating the local Vue instance for testing
const localVue = createLocalVue()
//mounting Vuex to it
localVue.use(Vuex)
- Меняя свой
shallowMount
Функция добавления такжеlocalVue
экземпляр для полезной нагрузки:
const wrapper = shallowMount(Users, { store, localVue })
Смотрите здесь ссылки на официальную документацию.
Другим полезным ресурсом о тестировании Vue является эта книга (для вашего конкретного случая см. Главу 7) и ее репозиторий GitHub.
Вы должны создать локальный Vue для ваших тестов и установить плагин Vuex:
import { shallowMount, createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex'
const localVue = createLocalVue()
localVue.use(Vuex)
const wrapper = shallowMount(...)