options.spec.ts 3.1 KB

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