2
0

methods-lifecycle.spec.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import Vue from 'vue'
  2. describe('Instance methods lifecycle', () => {
  3. describe('$mount', () => {
  4. it('empty mount', () => {
  5. const vm = new Vue({
  6. data: { msg: 'hi' },
  7. template: '<div>{{ msg }}</div>'
  8. }).$mount()
  9. expect(vm.$el.tagName).toBe('DIV')
  10. expect(vm.$el.textContent).toBe('hi')
  11. })
  12. it('mount to existing element', () => {
  13. const el = document.createElement('div')
  14. el.innerHTML = '{{ msg }}'
  15. const vm = new Vue({
  16. data: { msg: 'hi' }
  17. }).$mount(el)
  18. expect(vm.$el.tagName).toBe('DIV')
  19. expect(vm.$el.textContent).toBe('hi')
  20. })
  21. it('mount to id', () => {
  22. const el = document.createElement('div')
  23. el.id = 'mount-test'
  24. el.innerHTML = '{{ msg }}'
  25. document.body.appendChild(el)
  26. const vm = new Vue({
  27. data: { msg: 'hi' }
  28. }).$mount('#mount-test')
  29. expect(vm.$el.tagName).toBe('DIV')
  30. expect(vm.$el.textContent).toBe('hi')
  31. })
  32. })
  33. describe('$destroy', () => {
  34. it('remove self from parent', () => {
  35. const vm = new Vue({
  36. template: '<test></test>',
  37. components: {
  38. test: { template: '<div></div>' }
  39. }
  40. }).$mount()
  41. vm.$children[0].$destroy()
  42. expect(vm.$children.length).toBe(0)
  43. })
  44. it('teardown watchers', () => {
  45. const vm = new Vue({
  46. data: { a: 123 },
  47. template: '<div></div>'
  48. }).$mount()
  49. vm.$watch('a', () => {})
  50. vm.$destroy()
  51. expect(vm._watcher.active).toBe(false)
  52. expect(vm._watchers.every(w => !w.active)).toBe(true)
  53. })
  54. it('remove self from data observer', () => {
  55. const vm = new Vue({ data: { a: 1 }})
  56. vm.$destroy()
  57. expect(vm.$data.__ob__.vmCount).toBe(0)
  58. })
  59. it('avoid duplicate calls', () => {
  60. const spy = jasmine.createSpy('destroy')
  61. const vm = new Vue({
  62. beforeDestroy: spy
  63. })
  64. vm.$destroy()
  65. vm.$destroy()
  66. expect(spy.calls.count()).toBe(1)
  67. })
  68. })
  69. describe('$forceUpdate', () => {
  70. it('should force update', done => {
  71. const vm = new Vue({
  72. data: {
  73. a: {}
  74. },
  75. template: '<div>{{ a.b }}</div>'
  76. }).$mount()
  77. expect(vm.$el.textContent).toBe('')
  78. vm.a.b = 'foo'
  79. waitForUpdate(() => {
  80. // should not work because adding new property
  81. expect(vm.$el.textContent).toBe('')
  82. vm.$forceUpdate()
  83. }).then(() => {
  84. expect(vm.$el.textContent).toBe('foo')
  85. }).then(done)
  86. })
  87. })
  88. describe('$nextTick', () => {
  89. it('should be called after DOM update in correct context', done => {
  90. const vm = new Vue({
  91. template: '<div>{{ msg }}</div>',
  92. data: {
  93. msg: 'foo'
  94. }
  95. }).$mount()
  96. vm.msg = 'bar'
  97. vm.$nextTick(function () {
  98. expect(this).toBe(vm)
  99. expect(vm.$el.textContent).toBe('bar')
  100. done()
  101. })
  102. })
  103. })
  104. })