You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

145 lines
3.5 KiB

import Vue from 'vue'
describe('Directive v-ref', () => {
const components = {
test: {
id: 'test'
},
test2: {
id: 'test2'
}
}
it('should accept hyphenated refs', () => {
const vm = new Vue({
template: `<div>
<test v-ref:test></test>
<test2 v-ref:test-hyphen></test2>
</div>`,
components
})
vm.$mount()
expect(vm.$refs.test).toBeTruthy()
expect(vm.$refs.test.$options.id).toBe('test')
expect(vm.$refs['test-hyphen']).toBeTruthy()
expect(vm.$refs['test-hyphen'].$options.id).toBe('test2')
})
it('should work as a hyperscript prop', () => {
const vm = new Vue({
components,
render () {
const h = this.$createElement
return h('div', null, [
h('test', { ref: 'test' })
])
}
})
vm.$mount()
expect(vm.$refs.test).toBeTruthy()
expect(vm.$refs.test.$options.id).toBe('test')
})
it('should accept camelCase refs', () => {
const vm = new Vue({
template:
`<div>
<test v-ref:test></test>
<test2 v-ref:testCase></test2>
</div>`,
components
})
vm.$mount()
expect(vm.$refs.test).toBeTruthy()
expect(vm.$refs.test.$options.id).toBe('test')
expect(vm.$refs.testCase).toBeTruthy()
expect(vm.$refs.testCase.$options.id).toBe('test2')
})
it('should accept HOC component', () => {
const vm = new Vue({
template: '<test v-ref:test></test>',
components
})
vm.$mount()
expect(vm.$refs.test).toBeTruthy()
expect(vm.$refs.test.$options.id).toBe('test')
})
it('should accept dynamic component', done => {
const vm = new Vue({
template: `<div>
<component :is="test" v-ref:test></component>
</div>`,
components,
data: { test: 'test' }
})
vm.$mount()
expect(vm.$refs.test.$options.id).toBe('test')
vm.test = 'test2'
waitForUpdate(() => {
expect(vm.$refs.test.$options.id).toBe('test2')
vm.test = ''
}).then(() => {
expect(vm.$refs.test).toBeUndefined()
}).then(done)
})
it('should register as Array when used with v-for', done => {
const vm = new Vue({
data: {
items: [1, 2, 3]
},
template: `
<div>
<div v-for="n in items" v-ref:list>{{n}}</div>
</div>
`
}).$mount()
assertRefs()
// updating
vm.items.push(4)
waitForUpdate(assertRefs)
.then(() => { vm.items = [] })
.then(assertRefs)
.then(done)
function assertRefs () {
expect(Array.isArray(vm.$refs.list)).toBe(true)
expect(vm.$refs.list.length).toBe(vm.items.length)
expect(vm.$refs.list.every((item, i) => item.textContent === String(i + 1))).toBe(true)
}
})
it('should register as Array when used with v-for (components)', done => {
const vm = new Vue({
data: {
items: [1, 2, 3]
},
template: `
<div>
<test v-for="n in items" v-ref:list :n="n"></test>
</div>
`,
components: {
test: {
props: ['n'],
template: '<div>{{ n }}</div>'
}
}
}).$mount()
assertRefs()
// updating
vm.items.push(4)
waitForUpdate(assertRefs)
.then(() => { vm.items = [] })
.then(assertRefs)
.then(done)
function assertRefs () {
expect(Array.isArray(vm.$refs.list)).toBe(true)
expect(vm.$refs.list.length).toBe(vm.items.length)
expect(vm.$refs.list.every((comp, i) => comp.$el.textContent === String(i + 1))).toBe(true)
}
})
})