create-component.spec.js 3.5 KB

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