methods-lifecycle.spec.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import Vue from 'vue'
  2. import Dep from 'core/observer/dep'
  3. describe('Instance methods lifecycle', () => {
  4. describe('$mount', () => {
  5. it('empty mount', () => {
  6. const vm = new Vue({
  7. data: { msg: 'hi' },
  8. template: '<div>{{ msg }}</div>'
  9. }).$mount()
  10. expect(vm.$el.tagName).toBe('DIV')
  11. expect(vm.$el.textContent).toBe('hi')
  12. })
  13. it('mount to existing element', () => {
  14. const el = document.createElement('div')
  15. el.innerHTML = '{{ msg }}'
  16. const vm = new Vue({
  17. data: { msg: 'hi' }
  18. }).$mount(el)
  19. expect(vm.$el.tagName).toBe('DIV')
  20. expect(vm.$el.textContent).toBe('hi')
  21. })
  22. it('mount to id', () => {
  23. const el = document.createElement('div')
  24. el.id = 'mount-test'
  25. el.innerHTML = '{{ msg }}'
  26. document.body.appendChild(el)
  27. const vm = new Vue({
  28. data: { msg: 'hi' }
  29. }).$mount('#mount-test')
  30. expect(vm.$el.tagName).toBe('DIV')
  31. expect(vm.$el.textContent).toBe('hi')
  32. })
  33. it('Dep.target should be undefined in lifecycle', () => {
  34. const vm = new Vue({
  35. template: '<div><my-component></my-component></div>',
  36. components: {
  37. myComponent: {
  38. template: '<div>hi</div>',
  39. mounted () {
  40. const _msg = this.msg
  41. expect(Dep.target).toBe(undefined)
  42. },
  43. computed: {
  44. msg () {
  45. return 1
  46. }
  47. }
  48. }
  49. }
  50. }).$mount()
  51. })
  52. })
  53. describe('$destroy', () => {
  54. it('remove self from parent', () => {
  55. const vm = new Vue({
  56. template: '<test></test>',
  57. components: {
  58. test: { template: '<div></div>' }
  59. }
  60. }).$mount()
  61. vm.$children[0].$destroy()
  62. expect(vm.$children.length).toBe(0)
  63. })
  64. it('teardown watchers', () => {
  65. const vm = new Vue({
  66. data: { a: 123 },
  67. template: '<div></div>'
  68. }).$mount()
  69. vm.$watch('a', () => {})
  70. vm.$destroy()
  71. expect(vm._watcher.active).toBe(false)
  72. expect(vm._watchers.every(w => !w.active)).toBe(true)
  73. })
  74. it('remove self from data observer', () => {
  75. const vm = new Vue({ data: { a: 1 }})
  76. vm.$destroy()
  77. expect(vm.$data.__ob__.vmCount).toBe(0)
  78. })
  79. it('avoid duplicate calls', () => {
  80. const spy = jasmine.createSpy('destroy')
  81. const vm = new Vue({
  82. beforeDestroy: spy
  83. })
  84. vm.$destroy()
  85. vm.$destroy()
  86. expect(spy.calls.count()).toBe(1)
  87. })
  88. })
  89. describe('$forceUpdate', () => {
  90. it('should force update', done => {
  91. const vm = new Vue({
  92. data: {
  93. a: {}
  94. },
  95. template: '<div>{{ a.b }}</div>'
  96. }).$mount()
  97. expect(vm.$el.textContent).toBe('')
  98. vm.a.b = 'foo'
  99. waitForUpdate(() => {
  100. // should not work because adding new property
  101. expect(vm.$el.textContent).toBe('')
  102. vm.$forceUpdate()
  103. }).then(() => {
  104. expect(vm.$el.textContent).toBe('foo')
  105. }).then(done)
  106. })
  107. })
  108. describe('$nextTick', () => {
  109. it('should be called after DOM update in correct context', done => {
  110. const vm = new Vue({
  111. template: '<div>{{ msg }}</div>',
  112. data: {
  113. msg: 'foo'
  114. }
  115. }).$mount()
  116. vm.msg = 'bar'
  117. vm.$nextTick(function () {
  118. expect(this).toBe(vm)
  119. expect(vm.$el.textContent).toBe('bar')
  120. done()
  121. })
  122. })
  123. if (typeof Promise !== 'undefined') {
  124. it('should be called after DOM update in correct context, when using Promise syntax', done => {
  125. const vm = new Vue({
  126. template: '<div>{{ msg }}</div>',
  127. data: {
  128. msg: 'foo'
  129. }
  130. }).$mount()
  131. vm.msg = 'bar'
  132. vm.$nextTick().then(ctx => {
  133. expect(ctx).toBe(vm)
  134. expect(vm.$el.textContent).toBe('bar')
  135. done()
  136. })
  137. })
  138. }
  139. })
  140. })