rendererComponent.spec.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import {
  2. ref,
  3. h,
  4. render,
  5. nodeOps,
  6. serializeInner,
  7. nextTick,
  8. VNode
  9. } from '@vue/runtime-test'
  10. describe('renderer: component', () => {
  11. test('should update parent(hoc) component host el when child component self update', async () => {
  12. const value = ref(true)
  13. let parentVnode: VNode
  14. let childVnode1: VNode
  15. let childVnode2: VNode
  16. const Parent = {
  17. render: () => {
  18. // let Parent first rerender
  19. return (parentVnode = h(Child))
  20. }
  21. }
  22. const Child = {
  23. render: () => {
  24. return value.value
  25. ? (childVnode1 = h('div'))
  26. : (childVnode2 = h('span'))
  27. }
  28. }
  29. const root = nodeOps.createElement('div')
  30. render(h(Parent), root)
  31. expect(serializeInner(root)).toBe(`<div></div>`)
  32. expect(parentVnode!.el).toBe(childVnode1!.el)
  33. value.value = false
  34. await nextTick()
  35. expect(serializeInner(root)).toBe(`<span></span>`)
  36. expect(parentVnode!.el).toBe(childVnode2!.el)
  37. })
  38. it('should create an Component with props', () => {
  39. const Comp = {
  40. render: () => {
  41. return h('div')
  42. }
  43. }
  44. const root = nodeOps.createElement('div')
  45. render(h(Comp, { id: 'foo', class: 'bar' }), root)
  46. expect(serializeInner(root)).toBe(`<div id="foo" class="bar"></div>`)
  47. })
  48. it('should create an Component with direct text children', () => {
  49. const Comp = {
  50. render: () => {
  51. return h('div', 'test')
  52. }
  53. }
  54. const root = nodeOps.createElement('div')
  55. render(h(Comp, { id: 'foo', class: 'bar' }), root)
  56. expect(serializeInner(root)).toBe(`<div id="foo" class="bar">test</div>`)
  57. })
  58. it('should update an Component tag which is already mounted', () => {
  59. const Comp1 = {
  60. render: () => {
  61. return h('div', 'foo')
  62. }
  63. }
  64. const root = nodeOps.createElement('div')
  65. render(h(Comp1), root)
  66. expect(serializeInner(root)).toBe('<div>foo</div>')
  67. const Comp2 = {
  68. render: () => {
  69. return h('span', 'foo')
  70. }
  71. }
  72. render(h(Comp2), root)
  73. expect(serializeInner(root)).toBe('<span>foo</span>')
  74. })
  75. })