scope_spec.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  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. it('should initialize props', function () {
  28. var vm = new Vue({
  29. el: document.createElement('div'),
  30. props: ['c']
  31. })
  32. expect(vm.hasOwnProperty('c')).toBe(true)
  33. })
  34. it('should use default prop value if prop not provided', function () {
  35. var vm = new Vue({
  36. el: document.createElement('div'),
  37. props: ['c'],
  38. data: {
  39. c: 1
  40. }
  41. })
  42. expect(vm.c).toBe(1)
  43. })
  44. it('prop should overwrite default value', function () {
  45. var el = document.createElement('div')
  46. el.setAttribute('c', '2')
  47. var vm = new Vue({
  48. el: el,
  49. props: ['c'],
  50. data: {
  51. c: 1
  52. }
  53. })
  54. expect(vm.c).toBe(2)
  55. })
  56. it('replace $data', function () {
  57. var vm = new Vue({
  58. data: {
  59. a: 1
  60. }
  61. })
  62. vm.$data = { b: 2 }
  63. // proxy new key
  64. expect(vm.b).toBe(2)
  65. // unproxy old key that's no longer present
  66. expect(vm.hasOwnProperty('a')).toBe(false)
  67. })
  68. it('replace $data and handle props', function (done) {
  69. var el = document.createElement('div')
  70. var vm = new Vue({
  71. el: el,
  72. template: '<test a="{{a}}" b="{{*b}}" c="{{@c}}"></test>',
  73. data: {
  74. a: 1,
  75. b: 2,
  76. c: 3
  77. },
  78. components: {
  79. test: {
  80. props: ['a', 'b', 'c', 'd'],
  81. data: function () {
  82. return {
  83. a: null // should be overwritten
  84. }
  85. }
  86. }
  87. }
  88. })
  89. var child = vm._children[0]
  90. expect(child.a).toBe(1)
  91. expect(child.b).toBe(2)
  92. expect(child.c).toBe(3)
  93. // test new data without prop fields:
  94. // should just copy
  95. child.$data = {}
  96. expect(child.a).toBe(1)
  97. expect(child.b).toBe(2)
  98. expect(child.c).toBe(3)
  99. // test new data with value:
  100. child.$data = {
  101. a: 2, // one-way
  102. b: 3, // one-time
  103. c: 4 // two-way
  104. }
  105. expect(child.a).toBe(2)
  106. expect(child.b).toBe(3)
  107. expect(child.c).toBe(4)
  108. // assert parent state
  109. Vue.nextTick(function () {
  110. // one-way
  111. expect(vm.a).toBe(1)
  112. // one-time
  113. expect(vm.b).toBe(2)
  114. // two-way
  115. expect(vm.c).toBe(4)
  116. done()
  117. })
  118. })
  119. })
  120. describe('computed', function () {
  121. var Test = Vue.extend({
  122. computed: {
  123. c: function () {
  124. expect(this).toBe(vm)
  125. return this.a + this.b
  126. },
  127. d: {
  128. get: function () {
  129. expect(this).toBe(vm)
  130. return this.a + this.b
  131. },
  132. set: function (newVal) {
  133. expect(this).toBe(vm)
  134. var vals = newVal.split(' ')
  135. this.a = vals[0]
  136. this.b = vals[1]
  137. }
  138. }
  139. }
  140. })
  141. var vm = new Test({
  142. data: {
  143. a: 'a',
  144. b: 'b'
  145. }
  146. })
  147. it('get', function () {
  148. expect(vm.c).toBe('ab')
  149. expect(vm.d).toBe('ab')
  150. })
  151. it('set', function () {
  152. vm.c = 123 // should do nothing
  153. vm.d = 'c d'
  154. expect(vm.a).toBe('c')
  155. expect(vm.b).toBe('d')
  156. expect(vm.c).toBe('cd')
  157. expect(vm.d).toBe('cd')
  158. })
  159. it('inherit', function () {
  160. var child = vm.$addChild({
  161. inherit: true
  162. })
  163. expect(child.c).toBe('cd')
  164. child.d = 'e f'
  165. expect(vm.a).toBe('e')
  166. expect(vm.b).toBe('f')
  167. expect(vm.c).toBe('ef')
  168. expect(vm.d).toBe('ef')
  169. expect(child.a).toBe('e')
  170. expect(child.b).toBe('f')
  171. expect(child.c).toBe('ef')
  172. expect(child.d).toBe('ef')
  173. })
  174. it('same definition object bound to different instance', function () {
  175. vm = new Test({
  176. data: {
  177. a: 'A',
  178. b: 'B'
  179. }
  180. })
  181. expect(vm.c).toBe('AB')
  182. expect(vm.d).toBe('AB')
  183. vm.d = 'C D'
  184. expect(vm.a).toBe('C')
  185. expect(vm.b).toBe('D')
  186. expect(vm.c).toBe('CD')
  187. expect(vm.d).toBe('CD')
  188. })
  189. })
  190. describe('methods', function () {
  191. it('should work and have correct context', function () {
  192. var vm = new Vue({
  193. data: {
  194. a: 1
  195. },
  196. methods: {
  197. test: function () {
  198. expect(this instanceof Vue).toBe(true)
  199. return this.a
  200. }
  201. }
  202. })
  203. expect(vm.test()).toBe(1)
  204. var child = vm.$addChild({
  205. inherit: true
  206. })
  207. expect(child.test()).toBe(1)
  208. })
  209. })
  210. describe('meta', function () {
  211. var vm = new Vue({
  212. _meta: {
  213. $index: 0,
  214. $value: 'test'
  215. }
  216. })
  217. it('should define metas only on vm', function () {
  218. expect(vm.$index).toBe(0)
  219. expect(vm.$value).toBe('test')
  220. expect('$index' in vm.$data).toBe(false)
  221. expect('$value' in vm.$data).toBe(false)
  222. })
  223. })
  224. })