2
0

state_spec.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. var Vue = require('src')
  2. var _ = require('src/util')
  3. describe('Instance state initialization', function () {
  4. describe('data proxy', function () {
  5. var data = {
  6. a: 0,
  7. b: 0
  8. }
  9. var vm = new Vue({
  10. data: data
  11. })
  12. it('initial', function () {
  13. expect(vm.a).toBe(data.a)
  14. expect(vm.b).toBe(data.b)
  15. })
  16. it('vm => data', function () {
  17. vm.a = 1
  18. expect(data.a).toBe(1)
  19. expect(vm.a).toBe(data.a)
  20. })
  21. it('data => vm', function () {
  22. data.b = 2
  23. expect(vm.b).toBe(2)
  24. expect(vm.b).toBe(data.b)
  25. })
  26. })
  27. describe('$data', function () {
  28. it('should initialize props', function () {
  29. var vm = new Vue({
  30. el: document.createElement('div'),
  31. props: ['c']
  32. })
  33. expect(_.hasOwn(vm, 'c')).toBe(true)
  34. })
  35. it('should use default prop value if prop not provided', function () {
  36. var vm = new Vue({
  37. el: document.createElement('div'),
  38. props: ['c'],
  39. data: {
  40. c: 1
  41. }
  42. })
  43. expect(vm.c).toBe(1)
  44. })
  45. it('external prop should overwrite default value', function () {
  46. var el = document.createElement('div')
  47. el.setAttribute('v-bind:c', '2')
  48. el.textContent = '{{c}}'
  49. var vm = new Vue({
  50. el: el,
  51. props: ['c'],
  52. data: {
  53. c: 1
  54. }
  55. })
  56. expect(vm.c).toBe(2)
  57. expect(el.textContent).toBe('2')
  58. })
  59. it('props should be available in data() and create()', function () {
  60. var el = document.createElement('div')
  61. el.setAttribute(':c', '2')
  62. var vm = new Vue({
  63. el: el,
  64. props: ['c'],
  65. data: function () {
  66. expect(this.c).toBe(2)
  67. return {
  68. d: this.c + 1
  69. }
  70. },
  71. created: function () {
  72. expect(this.c).toBe(2)
  73. }
  74. })
  75. expect(vm.d).toBe(3)
  76. })
  77. it('replace $data', function () {
  78. var vm = new Vue({
  79. data: {
  80. a: 1
  81. }
  82. })
  83. vm.$data = { b: 2 }
  84. // proxy new key
  85. expect(vm.b).toBe(2)
  86. // unproxy old key that's no longer present
  87. expect(_.hasOwn(vm, 'a')).toBe(false)
  88. })
  89. })
  90. describe('computed', function () {
  91. var spyE = jasmine.createSpy('computed e')
  92. var spyF = jasmine.createSpy('cached computed f')
  93. var spyCachedWatcher = jasmine.createSpy('cached computed watcher')
  94. var Test = Vue.extend({
  95. computed: {
  96. // uncached
  97. c: {
  98. cache: false,
  99. get: function () {
  100. return this.a + this.b
  101. }
  102. },
  103. // with setter
  104. d: {
  105. get: function () {
  106. return this.a + this.b
  107. },
  108. set: function (newVal) {
  109. var vals = newVal.split(' ')
  110. this.a = vals[0]
  111. this.b = vals[1]
  112. }
  113. },
  114. // chained computed
  115. e: function () {
  116. return this.c + 'e'
  117. },
  118. // cached
  119. f: {
  120. get: function () {
  121. spyF()
  122. return this.ff
  123. }
  124. },
  125. // chained cached
  126. g: function () {
  127. return this.f + 1
  128. },
  129. // another cached, for watcher test
  130. h: {
  131. get: function () {
  132. return this.hh
  133. }
  134. }
  135. }
  136. })
  137. var vm = new Test({
  138. data: {
  139. a: 'a',
  140. b: 'b',
  141. ff: 0,
  142. hh: 0
  143. },
  144. watch: {
  145. e: spyE,
  146. h: spyCachedWatcher
  147. }
  148. })
  149. it('get', function () {
  150. expect(vm.c).toBe('ab')
  151. expect(vm.d).toBe('ab')
  152. expect(vm.e).toBe('abe')
  153. })
  154. it('set', function (done) {
  155. vm.c = 123 // should do nothing
  156. vm.d = 'c d'
  157. expect(vm.a).toBe('c')
  158. expect(vm.b).toBe('d')
  159. expect(vm.c).toBe('cd')
  160. expect(vm.d).toBe('cd')
  161. expect(vm.e).toBe('cde')
  162. Vue.nextTick(function () {
  163. expect(spyE).toHaveBeenCalledWith('cde', 'abe')
  164. done()
  165. })
  166. })
  167. it('cached computed', function () {
  168. expect(spyF).not.toHaveBeenCalled()
  169. var f = vm.f
  170. var g = vm.g
  171. expect(spyF.calls.count()).toBe(1)
  172. expect(f).toBe(0)
  173. expect(g).toBe(1)
  174. // get again
  175. f = vm.f
  176. g = vm.g
  177. // should not be evaluated again
  178. expect(spyF.calls.count()).toBe(1)
  179. expect(f).toBe(0)
  180. expect(g).toBe(1)
  181. // update dep
  182. vm.ff = 1
  183. f = vm.f
  184. g = vm.g
  185. expect(spyF.calls.count()).toBe(2)
  186. expect(f).toBe(1)
  187. expect(g).toBe(2)
  188. })
  189. it('watching cached computed', function (done) {
  190. expect(spyCachedWatcher).not.toHaveBeenCalled()
  191. vm.hh = 2
  192. Vue.nextTick(function () {
  193. expect(spyCachedWatcher).toHaveBeenCalledWith(2, 0)
  194. done()
  195. })
  196. })
  197. it('same definition object bound to different instance', function () {
  198. var vm = new Test({
  199. data: {
  200. a: 'A',
  201. b: 'B'
  202. }
  203. })
  204. expect(vm.c).toBe('AB')
  205. expect(vm.d).toBe('AB')
  206. vm.d = 'C D'
  207. expect(vm.a).toBe('C')
  208. expect(vm.b).toBe('D')
  209. expect(vm.c).toBe('CD')
  210. expect(vm.d).toBe('CD')
  211. expect(vm.e).toBe('CDe')
  212. })
  213. })
  214. describe('methods', function () {
  215. it('should work and have correct context', function () {
  216. var vm = new Vue({
  217. data: {
  218. a: 1
  219. },
  220. methods: {
  221. test: function () {
  222. expect(this instanceof Vue).toBe(true)
  223. return this.a
  224. }
  225. }
  226. })
  227. expect(vm.test()).toBe(1)
  228. })
  229. })
  230. describe('meta', function () {
  231. var vm = new Vue({
  232. _meta: {
  233. $index: 0,
  234. $value: 'test'
  235. }
  236. })
  237. it('should define metas only on vm', function () {
  238. expect(vm.$index).toBe(0)
  239. expect(vm.$value).toBe('test')
  240. expect('$index' in vm.$data).toBe(false)
  241. expect('$value' in vm.$data).toBe(false)
  242. })
  243. })
  244. })