import Vue from 'vue'
describe('Instance properties', () => {
it('$data', () => {
const data = { a: 1 }
const vm = new Vue({
data
})
expect(vm.a).toBe(1)
expect(vm.$data).toBe(data)
// vm -> data
vm.a = 2
expect(data.a).toBe(2)
// data -> vm
data.a = 3
expect(vm.a).toBe(3)
})
it('$options', () => {
const A = Vue.extend({
methods: {
a () {}
}
})
const vm = new A({
methods: {
b () {}
}
})
expect(typeof vm.$options.methods.a).toBe('function')
expect(typeof vm.$options.methods.b).toBe('function')
})
it('$root/$children', done => {
const vm = new Vue({
template: '
',
data: { ok: true },
components: {
test: {
template: ''
}
}
}).$mount()
expect(vm.$root).toBe(vm)
expect(vm.$children.length).toBe(1)
expect(vm.$children[0].$root).toBe(vm)
vm.ok = false
waitForUpdate(() => {
expect(vm.$children.length).toBe(0)
vm.ok = true
}).then(() => {
expect(vm.$children.length).toBe(1)
expect(vm.$children[0].$root).toBe(vm)
}).then(done)
})
it('$parent', () => {
const calls = []
const makeOption = name => ({
name,
template: `
`,
created () {
calls.push(`${name}:${this.$parent.$options.name}`)
}
})
new Vue({
template: `
`,
components: {
outer: makeOption('outer'),
middle: makeOption('middle'),
inner: makeOption('inner'),
next: makeOption('next')
}
}).$mount()
expect(calls).toEqual(['outer:undefined', 'middle:outer', 'inner:middle', 'next:undefined'])
})
})