events_spec.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. var Vue = require('../../../../src/vue')
  2. var _ = require('../../../../src/util')
  3. describe('Instance Events', function () {
  4. var spy, spy2
  5. beforeEach(function () {
  6. spy = jasmine.createSpy()
  7. spy2 = jasmine.createSpy()
  8. spyOn(_, 'warn')
  9. })
  10. describe('option events', function () {
  11. it('normal events', function () {
  12. var vm = new Vue({
  13. events: {
  14. test: spy,
  15. test2: [spy, spy]
  16. }
  17. })
  18. vm.$emit('test', 123)
  19. expect(spy).toHaveBeenCalledWith(123)
  20. vm.$emit('test2')
  21. expect(spy.calls.count()).toBe(3)
  22. })
  23. it('hook events', function () {
  24. var vm = new Vue({
  25. events: {
  26. 'hook:created': spy
  27. }
  28. })
  29. expect(spy).toHaveBeenCalled()
  30. })
  31. it('method name strings', function () {
  32. var vm = new Vue({
  33. events: {
  34. test: 'doSomething',
  35. test2: 'doSomethingElse'
  36. },
  37. methods: {
  38. doSomething: spy
  39. }
  40. })
  41. vm.$emit('test', 123)
  42. expect(spy).toHaveBeenCalledWith(123)
  43. vm.$emit('test2')
  44. expect(_.warn).toHaveBeenCalled()
  45. })
  46. })
  47. describe('option watchers', function () {
  48. it('normal', function (done) {
  49. var spyA = jasmine.createSpy()
  50. var spyB = jasmine.createSpy()
  51. var vm = new Vue({
  52. watch: {
  53. 'a.b.c': spyA,
  54. 'b + c': spyB
  55. },
  56. data: {
  57. a: {
  58. b: { c: 1 }
  59. },
  60. b: 1,
  61. c: 2
  62. }
  63. })
  64. vm.a.b.c = 2
  65. vm.b = 3
  66. vm.c = 4
  67. _.nextTick(function () {
  68. expect(spyA).toHaveBeenCalledWith(2, 1)
  69. expect(spyB).toHaveBeenCalledWith(7, 3)
  70. done()
  71. })
  72. })
  73. it('method name strings', function (done) {
  74. var spy = jasmine.createSpy()
  75. var vm = new Vue({
  76. watch: {
  77. 'a': 'test'
  78. },
  79. data: {
  80. a: 1
  81. },
  82. methods: {
  83. test: spy
  84. }
  85. })
  86. vm.a = 2
  87. _.nextTick(function () {
  88. expect(spy).toHaveBeenCalledWith(2, 1)
  89. done()
  90. })
  91. })
  92. })
  93. describe('hooks', function () {
  94. it('created', function () {
  95. var ctx
  96. var vm = new Vue({
  97. created: function () {
  98. // can't assert this === vm here
  99. // because the constructor hasn't returned yet
  100. ctx = this
  101. // should have observed data
  102. expect(this._data.__ob__).toBeTruthy()
  103. spy()
  104. }
  105. })
  106. expect(ctx).toBe(vm)
  107. expect(spy).toHaveBeenCalled()
  108. })
  109. it('beforeDestroy', function () {
  110. var vm = new Vue({
  111. beforeDestroy: function () {
  112. expect(this).toBe(vm)
  113. expect(this._isDestroyed).toBe(false)
  114. spy()
  115. }
  116. })
  117. vm.$destroy()
  118. expect(spy).toHaveBeenCalled()
  119. })
  120. it('destroyed', function () {
  121. var vm = new Vue({
  122. destroyed: function () {
  123. expect(this).toBe(vm)
  124. expect(this._isDestroyed).toBe(true)
  125. expect(this._data).toBeNull()
  126. spy()
  127. }
  128. })
  129. vm.$destroy()
  130. expect(spy).toHaveBeenCalled()
  131. })
  132. if (Vue.util.inBrowser) {
  133. it('beforeCompile', function () {
  134. var vm = new Vue({
  135. template: '{{a}}',
  136. data: { a: 1 },
  137. beforeCompile: function () {
  138. expect(this).toBe(vm)
  139. expect(this.$el).toBe(el)
  140. expect(this.$el.textContent).toBe('{{a}}')
  141. spy()
  142. }
  143. })
  144. var el = document.createElement('div')
  145. vm.$mount(el)
  146. expect(spy).toHaveBeenCalled()
  147. })
  148. it('compiled', function () {
  149. var vm = new Vue({
  150. template: '{{a}}',
  151. data: { a: 1 },
  152. compiled: function () {
  153. expect(this.$el).toBe(el)
  154. expect(this.$el.textContent).toBe('1')
  155. spy()
  156. }
  157. })
  158. var el = document.createElement('div')
  159. vm.$mount(el)
  160. expect(spy).toHaveBeenCalled()
  161. })
  162. it('ready', function () {
  163. var vm = new Vue({
  164. ready: spy
  165. })
  166. expect(spy).not.toHaveBeenCalled()
  167. var el = document.createElement('div')
  168. vm.$mount(el)
  169. expect(spy).not.toHaveBeenCalled()
  170. vm.$appendTo(document.body)
  171. expect(spy).toHaveBeenCalled()
  172. vm.$remove()
  173. // try mounting on something already in dom
  174. el = document.createElement('div')
  175. document.body.appendChild(el)
  176. vm = new Vue({
  177. el: el,
  178. ready: spy2
  179. })
  180. expect(spy2).toHaveBeenCalled()
  181. vm.$remove()
  182. })
  183. describe('attached/detached', function () {
  184. it('in DOM', function () {
  185. var el = document.createElement('div')
  186. var childEl = document.createElement('div')
  187. el.appendChild(childEl)
  188. document.body.appendChild(el)
  189. var parentVm = new Vue({
  190. el: el,
  191. attached: spy,
  192. detached: spy2
  193. })
  194. var childVm = parentVm.$addChild({
  195. el: childEl,
  196. attached: spy,
  197. detached: spy2
  198. })
  199. expect(spy.calls.count()).toBe(2)
  200. parentVm.$remove()
  201. expect(spy2.calls.count()).toBe(2)
  202. // child should be already detached
  203. // so the hook should not fire again
  204. childVm.$remove()
  205. expect(spy2.calls.count()).toBe(2)
  206. })
  207. it('create then attach', function () {
  208. var el = document.createElement('div')
  209. var childEl = document.createElement('div')
  210. el.appendChild(childEl)
  211. var parentVm = new Vue({
  212. el: el,
  213. attached: spy,
  214. detached: spy2
  215. })
  216. var childVm = parentVm.$addChild({
  217. el: childEl,
  218. attached: spy,
  219. detached: spy2
  220. })
  221. parentVm.$appendTo(document.body)
  222. expect(spy.calls.count()).toBe(2)
  223. // detach child first
  224. childVm.$remove()
  225. expect(spy2.calls.count()).toBe(1)
  226. // should only fire parent detach
  227. parentVm.$remove()
  228. expect(spy2.calls.count()).toBe(2)
  229. })
  230. it('should not fire on detached child', function () {
  231. var el = document.createElement('div')
  232. var childEl = document.createElement('div')
  233. var parentVm = new Vue({
  234. el: el,
  235. attached: spy
  236. })
  237. var childVm = parentVm.$addChild({
  238. el: childEl,
  239. attached: spy
  240. })
  241. parentVm.$appendTo(document.body)
  242. expect(spy.calls.count()).toBe(1)
  243. childVm.$appendTo(el)
  244. expect(spy.calls.count()).toBe(2)
  245. })
  246. })
  247. }
  248. })
  249. })