scope_spec.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. var Vue = require('../../../../src/vue')
  2. describe('Instance Scope', function () {
  3. describe('data proxy', function () {
  4. var data = {
  5. a: 0,
  6. b: 0
  7. }
  8. var vm = new Vue({
  9. data: data
  10. })
  11. it('initial', function () {
  12. expect(vm.a).toBe(data.a)
  13. expect(vm.b).toBe(data.b)
  14. })
  15. it('vm => data', function () {
  16. vm.a = 1
  17. expect(data.a).toBe(1)
  18. expect(vm.a).toBe(data.a)
  19. })
  20. it('data => vm', function () {
  21. data.b = 2
  22. expect(vm.b).toBe(2)
  23. expect(vm.b).toBe(data.b)
  24. })
  25. })
  26. describe('$data', function () {
  27. var vm = new Vue({
  28. props: ['c'],
  29. data: {
  30. a: 1
  31. }
  32. })
  33. it('should initialize props', function () {
  34. expect(vm.hasOwnProperty('c')).toBe(true)
  35. })
  36. it('replace $data', function () {
  37. vm.c = 3
  38. vm.$data = { b: 2 }
  39. // proxy new key
  40. expect(vm.b).toBe(2)
  41. // unproxy old key that's no longer present
  42. expect(vm.hasOwnProperty('a')).toBe(false)
  43. // should copy props
  44. expect(vm.c).toBe(3)
  45. })
  46. })
  47. describe('computed', function () {
  48. var Test = Vue.extend({
  49. computed: {
  50. c: function () {
  51. expect(this).toBe(vm)
  52. return this.a + this.b
  53. },
  54. d: {
  55. get: function () {
  56. expect(this).toBe(vm)
  57. return this.a + this.b
  58. },
  59. set: function (newVal) {
  60. expect(this).toBe(vm)
  61. var vals = newVal.split(' ')
  62. this.a = vals[0]
  63. this.b = vals[1]
  64. }
  65. }
  66. }
  67. })
  68. var vm = new Test({
  69. data: {
  70. a: 'a',
  71. b: 'b'
  72. }
  73. })
  74. it('get', function () {
  75. expect(vm.c).toBe('ab')
  76. expect(vm.d).toBe('ab')
  77. })
  78. it('set', function () {
  79. vm.c = 123 // should do nothing
  80. vm.d = 'c d'
  81. expect(vm.a).toBe('c')
  82. expect(vm.b).toBe('d')
  83. expect(vm.c).toBe('cd')
  84. expect(vm.d).toBe('cd')
  85. })
  86. it('inherit', function () {
  87. var child = vm.$addChild({
  88. inherit: true
  89. })
  90. expect(child.c).toBe('cd')
  91. child.d = 'e f'
  92. expect(vm.a).toBe('e')
  93. expect(vm.b).toBe('f')
  94. expect(vm.c).toBe('ef')
  95. expect(vm.d).toBe('ef')
  96. expect(child.a).toBe('e')
  97. expect(child.b).toBe('f')
  98. expect(child.c).toBe('ef')
  99. expect(child.d).toBe('ef')
  100. })
  101. it('same definition object bound to different instance', function () {
  102. vm = new Test({
  103. data: {
  104. a: 'A',
  105. b: 'B'
  106. }
  107. })
  108. expect(vm.c).toBe('AB')
  109. expect(vm.d).toBe('AB')
  110. vm.d = 'C D'
  111. expect(vm.a).toBe('C')
  112. expect(vm.b).toBe('D')
  113. expect(vm.c).toBe('CD')
  114. expect(vm.d).toBe('CD')
  115. })
  116. })
  117. describe('methods', function () {
  118. it('should work and have correct context', function () {
  119. var vm = new Vue({
  120. data: {
  121. a: 1
  122. },
  123. methods: {
  124. test: function () {
  125. expect(this instanceof Vue).toBe(true)
  126. return this.a
  127. }
  128. }
  129. })
  130. expect(vm.test()).toBe(1)
  131. var child = vm.$addChild({
  132. inherit: true
  133. })
  134. expect(child.test()).toBe(1)
  135. })
  136. })
  137. describe('meta', function () {
  138. var vm = new Vue({
  139. _meta: {
  140. $index: 0,
  141. $value: 'test'
  142. }
  143. })
  144. it('should define metas only on vm', function () {
  145. expect(vm.$index).toBe(0)
  146. expect(vm.$value).toBe('test')
  147. expect('$index' in vm.$data).toBe(false)
  148. expect('$value' in vm.$data).toBe(false)
  149. })
  150. })
  151. })