options.spec.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import { vi } from 'vitest'
  2. import Vue from '@vue/compat'
  3. import { nextTick } from '../../runtime-core/src/scheduler'
  4. import {
  5. DeprecationTypes,
  6. deprecationData,
  7. toggleDeprecationWarning
  8. } from '../../runtime-core/src/compat/compatConfig'
  9. beforeEach(() => {
  10. toggleDeprecationWarning(true)
  11. Vue.configureCompat({
  12. MODE: 2,
  13. GLOBAL_MOUNT: 'suppress-warning',
  14. GLOBAL_EXTEND: 'suppress-warning'
  15. })
  16. })
  17. afterEach(() => {
  18. toggleDeprecationWarning(false)
  19. Vue.configureCompat({ MODE: 3 })
  20. })
  21. test('root data plain object', () => {
  22. const vm = new Vue({
  23. data: { foo: 1 } as any,
  24. template: `{{ foo }}`
  25. }).$mount()
  26. expect(vm.$el.textContent).toBe('1')
  27. expect(
  28. deprecationData[DeprecationTypes.OPTIONS_DATA_FN].message
  29. ).toHaveBeenWarned()
  30. })
  31. test('data deep merge', () => {
  32. const mixin = {
  33. data() {
  34. return {
  35. foo: {
  36. baz: 2
  37. }
  38. }
  39. }
  40. }
  41. const vm = new Vue({
  42. mixins: [mixin],
  43. data: () => ({
  44. foo: {
  45. bar: 1
  46. },
  47. selfData: 3
  48. }),
  49. template: `{{ { selfData, foo } }}`
  50. }).$mount()
  51. expect(vm.$el.textContent).toBe(
  52. JSON.stringify({ selfData: 3, foo: { baz: 2, bar: 1 } }, null, 2)
  53. )
  54. expect(
  55. (deprecationData[DeprecationTypes.OPTIONS_DATA_MERGE].message as Function)(
  56. 'foo'
  57. )
  58. ).toHaveBeenWarned()
  59. })
  60. // #3852
  61. test('data deep merge w/ extended constructor', () => {
  62. const App = Vue.extend({
  63. template: `<pre>{{ { mixinData, selfData } }}</pre>`,
  64. mixins: [{ data: () => ({ mixinData: 'mixinData' }) }],
  65. data: () => ({ selfData: 'selfData' })
  66. })
  67. const vm = new App().$mount()
  68. expect(vm.$el.textContent).toBe(
  69. JSON.stringify(
  70. {
  71. mixinData: 'mixinData',
  72. selfData: 'selfData'
  73. },
  74. null,
  75. 2
  76. )
  77. )
  78. })
  79. test('beforeDestroy/destroyed', async () => {
  80. const beforeDestroy = vi.fn()
  81. const destroyed = vi.fn()
  82. const child = {
  83. template: `foo`,
  84. beforeDestroy,
  85. destroyed
  86. }
  87. const vm = new Vue({
  88. template: `<child v-if="ok"/>`,
  89. data() {
  90. return { ok: true }
  91. },
  92. components: { child }
  93. }).$mount() as any
  94. vm.ok = false
  95. await nextTick()
  96. expect(beforeDestroy).toHaveBeenCalled()
  97. expect(destroyed).toHaveBeenCalled()
  98. expect(
  99. deprecationData[DeprecationTypes.OPTIONS_BEFORE_DESTROY].message
  100. ).toHaveBeenWarned()
  101. expect(
  102. deprecationData[DeprecationTypes.OPTIONS_DESTROYED].message
  103. ).toHaveBeenWarned()
  104. })
  105. test('beforeDestroy/destroyed in Vue.extend components', async () => {
  106. const beforeDestroy = vi.fn()
  107. const destroyed = vi.fn()
  108. const child = Vue.extend({
  109. template: `foo`,
  110. beforeDestroy,
  111. destroyed
  112. })
  113. const vm = new Vue({
  114. template: `<child v-if="ok"/>`,
  115. data() {
  116. return { ok: true }
  117. },
  118. components: { child }
  119. }).$mount() as any
  120. vm.ok = false
  121. await nextTick()
  122. expect(beforeDestroy).toHaveBeenCalled()
  123. expect(destroyed).toHaveBeenCalled()
  124. expect(
  125. deprecationData[DeprecationTypes.OPTIONS_BEFORE_DESTROY].message
  126. ).toHaveBeenWarned()
  127. expect(
  128. deprecationData[DeprecationTypes.OPTIONS_DESTROYED].message
  129. ).toHaveBeenWarned()
  130. })