vnodeHooks.spec.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import { vi } from 'vitest'
  2. import {
  3. h,
  4. render,
  5. nodeOps,
  6. VNodeProps,
  7. TestElement,
  8. TestNodeTypes,
  9. VNode
  10. } from '@vue/runtime-test'
  11. describe('renderer: vnode hooks', () => {
  12. function assertHooks(hooks: VNodeProps, vnode1: VNode, vnode2: VNode) {
  13. const root = nodeOps.createElement('div')
  14. render(vnode1, root)
  15. expect(hooks.onVnodeBeforeMount).toHaveBeenCalledWith(vnode1, null)
  16. expect(hooks.onVnodeMounted).toHaveBeenCalledWith(vnode1, null)
  17. expect(hooks.onVnodeBeforeUpdate).not.toHaveBeenCalled()
  18. expect(hooks.onVnodeUpdated).not.toHaveBeenCalled()
  19. expect(hooks.onVnodeBeforeUnmount).not.toHaveBeenCalled()
  20. expect(hooks.onVnodeUnmounted).not.toHaveBeenCalled()
  21. // update
  22. render(vnode2, root)
  23. expect(hooks.onVnodeBeforeMount).toHaveBeenCalledTimes(1)
  24. expect(hooks.onVnodeMounted).toHaveBeenCalledTimes(1)
  25. expect(hooks.onVnodeBeforeUpdate).toHaveBeenCalledWith(vnode2, vnode1)
  26. expect(hooks.onVnodeUpdated).toHaveBeenCalledWith(vnode2, vnode1)
  27. expect(hooks.onVnodeBeforeUnmount).not.toHaveBeenCalled()
  28. expect(hooks.onVnodeUnmounted).not.toHaveBeenCalled()
  29. // unmount
  30. render(null, root)
  31. expect(hooks.onVnodeBeforeMount).toHaveBeenCalledTimes(1)
  32. expect(hooks.onVnodeMounted).toHaveBeenCalledTimes(1)
  33. expect(hooks.onVnodeBeforeUpdate).toHaveBeenCalledTimes(1)
  34. expect(hooks.onVnodeUpdated).toHaveBeenCalledTimes(1)
  35. expect(hooks.onVnodeBeforeUnmount).toHaveBeenCalledWith(vnode2, null)
  36. expect(hooks.onVnodeUnmounted).toHaveBeenCalledWith(vnode2, null)
  37. }
  38. test('should work on element', () => {
  39. const hooks: VNodeProps = {
  40. onVnodeBeforeMount: vi.fn(),
  41. onVnodeMounted: vi.fn(),
  42. onVnodeBeforeUpdate: vi.fn(vnode => {
  43. expect((vnode.el as TestElement).children[0]).toMatchObject({
  44. type: TestNodeTypes.TEXT,
  45. text: 'foo'
  46. })
  47. }),
  48. onVnodeUpdated: vi.fn(vnode => {
  49. expect((vnode.el as TestElement).children[0]).toMatchObject({
  50. type: TestNodeTypes.TEXT,
  51. text: 'bar'
  52. })
  53. }),
  54. onVnodeBeforeUnmount: vi.fn(),
  55. onVnodeUnmounted: vi.fn()
  56. }
  57. assertHooks(hooks, h('div', hooks, 'foo'), h('div', hooks, 'bar'))
  58. })
  59. test('should work on component', () => {
  60. const Comp = (props: { msg: string }) => props.msg
  61. const hooks: VNodeProps = {
  62. onVnodeBeforeMount: vi.fn(),
  63. onVnodeMounted: vi.fn(),
  64. onVnodeBeforeUpdate: vi.fn(vnode => {
  65. expect(vnode.el as TestElement).toMatchObject({
  66. type: TestNodeTypes.TEXT,
  67. text: 'foo'
  68. })
  69. }),
  70. onVnodeUpdated: vi.fn(vnode => {
  71. expect(vnode.el as TestElement).toMatchObject({
  72. type: TestNodeTypes.TEXT,
  73. text: 'bar'
  74. })
  75. }),
  76. onVnodeBeforeUnmount: vi.fn(),
  77. onVnodeUnmounted: vi.fn()
  78. }
  79. assertHooks(
  80. hooks,
  81. h(Comp, {
  82. ...hooks,
  83. msg: 'foo'
  84. }),
  85. h(Comp, {
  86. ...hooks,
  87. msg: 'bar'
  88. })
  89. )
  90. })
  91. })