2
0

ssrDynamicComponent.spec.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { createApp, createVNode } from 'vue'
  2. import { renderToString } from '../src/renderToString'
  3. describe('ssr: dynamic component', () => {
  4. test('resolved to component', async () => {
  5. expect(
  6. await renderToString(
  7. createApp({
  8. components: {
  9. one: {
  10. template: `<div><slot/></div>`,
  11. },
  12. },
  13. template: `<component :is="'one'"><span>slot</span></component>`,
  14. }),
  15. ),
  16. ).toBe(`<div><!--[--><span>slot</span><!--]--></div>`)
  17. })
  18. test('resolve to element', async () => {
  19. expect(
  20. await renderToString(
  21. createApp({
  22. template: `<component :is="'p'"><span>slot</span></component>`,
  23. }),
  24. ),
  25. ).toBe(`<p><span>slot</span></p>`)
  26. })
  27. test('resolve to component vnode', async () => {
  28. const Child = {
  29. props: ['id'],
  30. template: `<div>{{ id }}<slot/></div>`,
  31. }
  32. expect(
  33. await renderToString(
  34. createApp({
  35. setup() {
  36. return {
  37. vnode: createVNode(Child, { id: 'test' }),
  38. }
  39. },
  40. template: `<component :is="vnode"><span>slot</span></component>`,
  41. }),
  42. ),
  43. ).toBe(`<div>test<!--[--><span>slot</span><!--]--></div>`)
  44. })
  45. test('resolve to element vnode', async () => {
  46. expect(
  47. await renderToString(
  48. createApp({
  49. setup() {
  50. return {
  51. vnode: createVNode('div', { id: 'test' }),
  52. }
  53. },
  54. template: `<component :is="vnode"><span>slot</span></component>`,
  55. }),
  56. ),
  57. ).toBe(`<div id="test"><span>slot</span></div>`)
  58. })
  59. })