Я пытался разобраться в модульном тестировании компонентов Vue, но я не могу понять, как макетировать / заглушать объекты хранилища и методы, которые вызывают асинхронный 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: {
getUsers(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
is undefined
.Я чувствую, что что-то упускаю из-за насмешек или того факта, что getUsers()
, вызываемый на монтировке, отключает его.