componentExpose.spec.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { describe, expect } from 'vitest'
  2. import { makeRender } from './_utils'
  3. import { type Ref, ref } from '@vue/reactivity'
  4. const define = makeRender()
  5. describe('component expose', () => {
  6. test('should work', async () => {
  7. const expxosedObj = { foo: 1 }
  8. const { render } = define({
  9. setup(_, { expose }) {
  10. expose(expxosedObj)
  11. },
  12. })
  13. const { instance } = render()
  14. expect(instance?.exposed).toEqual(expxosedObj)
  15. })
  16. test('should warn when called multiple times', async () => {
  17. const { render } = define({
  18. setup(_, { expose }) {
  19. expose()
  20. expose()
  21. },
  22. })
  23. render()
  24. expect(
  25. 'expose() should be called only once per setup().',
  26. ).toHaveBeenWarned()
  27. })
  28. test('should warn when passed non-object', async () => {
  29. const exposedRef = ref<number[] | Ref>([1, 2, 3])
  30. const { render } = define({
  31. setup(_, { expose }) {
  32. expose(exposedRef.value)
  33. },
  34. })
  35. render()
  36. expect(
  37. 'expose() should be passed a plain object, received array.',
  38. ).toHaveBeenWarned()
  39. exposedRef.value = ref(1)
  40. render()
  41. expect(
  42. 'expose() should be passed a plain object, received ref.',
  43. ).toHaveBeenWarned()
  44. })
  45. })