rendererSuspense.spec.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import {
  2. h,
  3. ref,
  4. Suspense,
  5. ComponentOptions,
  6. render,
  7. nodeOps,
  8. serializeInner,
  9. nextTick
  10. } from '@vue/runtime-test'
  11. describe('renderer: suspense', () => {
  12. it('should work', async () => {
  13. const msg = ref('hello')
  14. const deps: Promise<any>[] = []
  15. const createAsyncComponent = (loader: () => Promise<ComponentOptions>) => ({
  16. async setup(props: any, { slots }: any) {
  17. const p = loader()
  18. deps.push(p)
  19. const Inner = await p
  20. return () => h(Inner, props, slots)
  21. }
  22. })
  23. // TODO test mounted hook & watch callback buffering
  24. const AsyncChild = createAsyncComponent(
  25. () =>
  26. new Promise(resolve => {
  27. setTimeout(() => {
  28. resolve({
  29. setup(props: { msg: string }) {
  30. return () => h('div', props.msg)
  31. }
  32. })
  33. }, 0)
  34. })
  35. )
  36. const AsyncChild2 = createAsyncComponent(
  37. () =>
  38. new Promise(resolve => {
  39. setTimeout(() => {
  40. resolve({
  41. setup(props: { msg: string }) {
  42. return () => h('div', props.msg)
  43. }
  44. })
  45. }, 10)
  46. })
  47. )
  48. const Mid = {
  49. setup() {
  50. return () =>
  51. h(AsyncChild, {
  52. msg: msg.value
  53. })
  54. }
  55. }
  56. const Comp = {
  57. name: 'root',
  58. setup() {
  59. // TODO test fallback
  60. return () =>
  61. h(Suspense, [msg.value, h(Mid), h(AsyncChild2, { msg: 'child 2' })])
  62. }
  63. }
  64. const root = nodeOps.createElement('div')
  65. render(h(Comp), root)
  66. expect(serializeInner(root)).toBe(`<!---->`)
  67. await Promise.all(deps)
  68. await nextTick()
  69. expect(serializeInner(root)).toBe(
  70. `<!---->hello<div>hello</div><div>child 2</div><!---->`
  71. )
  72. })
  73. test.todo('fallback content update')
  74. test.todo('content update before suspense resolve')
  75. test.todo('unmount before suspense resolve')
  76. test.todo('nested suspense')
  77. })