Vue.js - karma/phantomjs 测试中丢失的数据
Vue.js - Data lost in karma/phantomjs tests
我正在为 Vue 应用编写一些单元测试。当我尝试测试 DOM 内容时一切正常,但我无法访问我的组件的数据。事实上,如果我 console.log
我的组件 $data
属性 没有数据,它会打印一个空对象,没有初始定义的数据或任何其他数据。什么都没有。
这是一些代码
一些vue组件
<template>
<form @submit.prevent="saveAccount">
<label for="accountType">Tipo de cuenta</label>
<select class="form-control" id="accountType" v-model="newAccount.type">
<option v-for="type in accountTypes" v-bind:value="type.value">
{{type.label}}
</option>
</select>
</form>
</template>
<script>
export default {
data () {
return {
accountTypes: [
{value: '1', label: 'Activo'},
{value: '2', label: 'Pasivo'},
{value: '3', label: 'Patrimonio'},
{value: '4', label: 'INTO'}
]
}
}
}
</script>
我的测试
beforeAll(() => {
vm = new Vue({
template: '<div><account></account></div>',
components: { account }
}).$mount()
})
afterAll(() => {
vm.$destroy(true)
})
it('account type', () => {
// this pass
expect(vm.$el.querySelectorAll('#accountType option').length).toBe(4)
const options = vm.$el.querySelectorAll('#accountType option')
// here accountTypes is undefined
const accountValues = vm.accountTypes.map(type => {
return type.value
})
options.forEach(option => {
expect(accountValues.indexOf(option.value)).not.toBe(-1)
})
})
省略了部分代码。那么,为什么我的组件数据是空的,但同时在 DOM 中正确呈现?
经过反复尝试,我找到了答案,现在很明显了。问题是,我在错误的地方搜索数据。 vm
我这样定义的对象
vm = new Vue({
template: '<div><account></account></div>',
components: { account }
}).$mount()
是一个只有组件和模板选项的 Vue 实例,我要搜索的数据在该实例的 子实例 中。所以,我必须使用这种方式来访问数据
const accountInstance = vm.$children[0]
这行得通,因为为了测试我定义了一个易于识别的单子项。我在使用 const accountInstance = new account()
之前也尝试过,但这会引发错误,因为 vue 组件不是构造函数
我正在为 Vue 应用编写一些单元测试。当我尝试测试 DOM 内容时一切正常,但我无法访问我的组件的数据。事实上,如果我 console.log
我的组件 $data
属性 没有数据,它会打印一个空对象,没有初始定义的数据或任何其他数据。什么都没有。
这是一些代码
一些vue组件
<template>
<form @submit.prevent="saveAccount">
<label for="accountType">Tipo de cuenta</label>
<select class="form-control" id="accountType" v-model="newAccount.type">
<option v-for="type in accountTypes" v-bind:value="type.value">
{{type.label}}
</option>
</select>
</form>
</template>
<script>
export default {
data () {
return {
accountTypes: [
{value: '1', label: 'Activo'},
{value: '2', label: 'Pasivo'},
{value: '3', label: 'Patrimonio'},
{value: '4', label: 'INTO'}
]
}
}
}
</script>
我的测试
beforeAll(() => {
vm = new Vue({
template: '<div><account></account></div>',
components: { account }
}).$mount()
})
afterAll(() => {
vm.$destroy(true)
})
it('account type', () => {
// this pass
expect(vm.$el.querySelectorAll('#accountType option').length).toBe(4)
const options = vm.$el.querySelectorAll('#accountType option')
// here accountTypes is undefined
const accountValues = vm.accountTypes.map(type => {
return type.value
})
options.forEach(option => {
expect(accountValues.indexOf(option.value)).not.toBe(-1)
})
})
省略了部分代码。那么,为什么我的组件数据是空的,但同时在 DOM 中正确呈现?
经过反复尝试,我找到了答案,现在很明显了。问题是,我在错误的地方搜索数据。 vm
我这样定义的对象
vm = new Vue({
template: '<div><account></account></div>',
components: { account }
}).$mount()
是一个只有组件和模板选项的 Vue 实例,我要搜索的数据在该实例的 子实例 中。所以,我必须使用这种方式来访问数据
const accountInstance = vm.$children[0]
这行得通,因为为了测试我定义了一个易于识别的单子项。我在使用 const accountInstance = new account()
之前也尝试过,但这会引发错误,因为 vue 组件不是构造函数