forked from vuejs/vue
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcreate-component.spec.js
116 lines (110 loc) · 3.46 KB
/
create-component.spec.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import Vue from 'vue'
import { createComponent } from 'core/vdom/create-component'
describe('create-component', () => {
let vm
beforeEach(done => {
vm = new Vue({
template: '<p>{{msg}}</p>',
data () {
return { msg: 'hello, my children' }
}
}).$mount()
Vue.nextTick(done)
})
it('create a component basically', () => {
const child = {
name: 'child',
props: ['msg'],
render () {}
}
const data = {
props: { msg: 'hello world' },
attrs: { id: 1 },
staticAttrs: { class: 'foo' },
on: { notify: 'onNotify' }
}
const vnode = createComponent(child, data, vm, vm)
expect(vnode.tag).toMatch(/vue-component-[0-9]+-child/)
expect(vnode.data.attrs).toEqual({ id: 1 })
expect(vnode.data.staticAttrs).toEqual({ class: 'foo' })
expect(vnode.componentOptions.propsData).toEqual({ msg: 'hello world' })
expect(vnode.componentOptions.listeners).toEqual({ notify: 'onNotify' })
expect(vnode.children).toBeUndefined()
expect(vnode.text).toBeUndefined()
expect(vnode.elm).toBeUndefined()
expect(vnode.ns).toBeUndefined()
expect(vnode.context).toEqual(vm)
})
it('create a component when resolved with async loading', done => {
let vnode = null
const data = {
props: {},
staticAttrs: { class: 'foo' }
}
spyOn(vm, '$forceUpdate')
function async (resolve, reject) {
setTimeout(() => {
resolve({
name: 'child',
props: ['msg']
})
Vue.nextTick(loaded)
}, 0)
}
function go () {
vnode = createComponent(async, data, vm, vm)
expect(vnode.isComment).toBe(true) // not to be loaded yet.
expect(vnode.asyncFactory).toBe(async)
expect(vnode.asyncFactory.contexts.length).toEqual(1)
}
function loaded () {
vnode = createComponent(async, data, vm, vm)
expect(vnode.tag).toMatch(/vue-component-[0-9]+-child/)
expect(vnode.data.staticAttrs).toEqual({ class: 'foo' })
expect(vnode.children).toBeUndefined()
expect(vnode.text).toBeUndefined()
expect(vnode.elm).toBeUndefined()
expect(vnode.ns).toBeUndefined()
expect(vnode.context).toEqual(vm)
expect(vnode.asyncFactory.contexts.length).toEqual(0)
expect(vm.$forceUpdate).toHaveBeenCalled()
done()
}
go()
})
it('not create a component when rejected with async loading', done => {
let vnode = null
const data = {
props: { msg: 'hello world' },
attrs: { id: 1 }
}
const reason = 'failed!!'
function async (resolve, reject) {
setTimeout(() => {
reject(reason)
Vue.nextTick(failed)
}, 0)
}
function go () {
vnode = createComponent(async, data, vm, vm)
expect(vnode.isComment).toBe(true) // not to be loaded yet.
}
function failed () {
vnode = createComponent(async, data, vm, vm)
expect(vnode.isComment).toBe(true) // failed, still a comment node
expect(`Failed to resolve async component: ${async}\nReason: ${reason}`).toHaveBeenWarned()
done()
}
go()
})
it('not create a component when specified with falsy', () => {
const vnode = createComponent(null, {}, vm, vm)
expect(vnode).toBeUndefined()
})
it('warn component definition type', () => {
const Ctor = 'child'
const vnode = createComponent(Ctor, {}, vm, vm)
expect(vnode).toBeUndefined()
expect(`Invalid Component definition: ${Ctor}`).toHaveBeenWarned()
})
})