events_spec.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  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. 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(hasWarned(_, 'Unknown method')).toBe(true)
  45. })
  46. })
  47. describe('option watchers', function () {
  48. it('normal', function (done) {
  49. var spyA = jasmine.createSpy()
  50. var spyB = jasmine.createSpy()
  51. var count = 0
  52. var a = {
  53. b: { c: 1 }
  54. }
  55. var vm = new Vue({
  56. watch: {
  57. 'a.b.c': spyA,
  58. 'b + c': spyB,
  59. a: {
  60. deep: true,
  61. immediate: true,
  62. handler: 'test'
  63. }
  64. },
  65. data: {
  66. a: a,
  67. b: 1,
  68. c: 2
  69. },
  70. methods: {
  71. test: function (val) {
  72. count++
  73. expect(val).toBe(a)
  74. }
  75. }
  76. })
  77. vm.a.b.c = 2
  78. vm.b = 3
  79. vm.c = 4
  80. expect(count).toBe(1)
  81. _.nextTick(function () {
  82. expect(spyA).toHaveBeenCalledWith(2, 1)
  83. expect(spyB).toHaveBeenCalledWith(7, 3)
  84. expect(count).toBe(2)
  85. done()
  86. })
  87. })
  88. it('method name strings', function (done) {
  89. var spy = jasmine.createSpy()
  90. var vm = new Vue({
  91. watch: {
  92. 'a': 'test'
  93. },
  94. data: {
  95. a: 1
  96. },
  97. methods: {
  98. test: spy
  99. }
  100. })
  101. vm.a = 2
  102. _.nextTick(function () {
  103. expect(spy).toHaveBeenCalledWith(2, 1)
  104. done()
  105. })
  106. })
  107. })
  108. describe('hooks', function () {
  109. it('created', function () {
  110. var ctx
  111. var vm = new Vue({
  112. created: function () {
  113. // can't assert this === vm here
  114. // because the constructor hasn't returned yet
  115. ctx = this
  116. // should have observed data
  117. expect(this._data.__ob__).toBeTruthy()
  118. spy()
  119. }
  120. })
  121. expect(ctx).toBe(vm)
  122. expect(spy).toHaveBeenCalled()
  123. })
  124. it('beforeDestroy', function () {
  125. var vm = new Vue({
  126. beforeDestroy: function () {
  127. expect(this).toBe(vm)
  128. expect(this._isDestroyed).toBe(false)
  129. spy()
  130. }
  131. })
  132. vm.$destroy()
  133. expect(spy).toHaveBeenCalled()
  134. })
  135. it('destroyed', function () {
  136. var vm = new Vue({
  137. destroyed: function () {
  138. expect(this).toBe(vm)
  139. expect(this._isDestroyed).toBe(true)
  140. spy()
  141. }
  142. })
  143. vm.$destroy()
  144. expect(spy).toHaveBeenCalled()
  145. })
  146. if (Vue.util.inBrowser) {
  147. it('beforeCompile', function () {
  148. var vm = new Vue({
  149. template: '{{a}}',
  150. data: { a: 1 },
  151. beforeCompile: function () {
  152. expect(this).toBe(vm)
  153. expect(this.$el).toBe(el)
  154. expect(this.$el.textContent).toBe('{{a}}')
  155. spy()
  156. }
  157. })
  158. var el = document.createElement('div')
  159. vm.$mount(el)
  160. expect(spy).toHaveBeenCalled()
  161. })
  162. it('compiled', function () {
  163. var vm = new Vue({
  164. template: '{{a}}',
  165. data: { a: 1 },
  166. compiled: function () {
  167. expect(this.$el).toBe(el)
  168. expect(this.$el.textContent).toBe('1')
  169. spy()
  170. }
  171. })
  172. var el = document.createElement('div')
  173. vm.$mount(el)
  174. expect(spy).toHaveBeenCalled()
  175. })
  176. it('ready', function () {
  177. var vm = new Vue({
  178. ready: spy
  179. })
  180. expect(spy).not.toHaveBeenCalled()
  181. var el = document.createElement('div')
  182. vm.$mount(el)
  183. expect(spy).not.toHaveBeenCalled()
  184. vm.$appendTo(document.body)
  185. expect(spy).toHaveBeenCalled()
  186. vm.$remove()
  187. // try mounting on something already in dom
  188. el = document.createElement('div')
  189. document.body.appendChild(el)
  190. vm = new Vue({
  191. el: el,
  192. ready: spy2
  193. })
  194. expect(spy2).toHaveBeenCalled()
  195. vm.$remove()
  196. })
  197. describe('attached/detached', function () {
  198. it('in DOM', function () {
  199. var el = document.createElement('div')
  200. var childEl = document.createElement('div')
  201. el.appendChild(childEl)
  202. document.body.appendChild(el)
  203. var parentVm = new Vue({
  204. el: el,
  205. attached: spy,
  206. detached: spy2
  207. })
  208. var childVm = parentVm.$addChild({
  209. el: childEl,
  210. attached: spy,
  211. detached: spy2
  212. })
  213. expect(spy.calls.count()).toBe(2)
  214. parentVm.$remove()
  215. expect(spy2.calls.count()).toBe(2)
  216. // child should be already detached
  217. // so the hook should not fire again
  218. childVm.$remove()
  219. expect(spy2.calls.count()).toBe(2)
  220. })
  221. it('create then attach', function () {
  222. var el = document.createElement('div')
  223. var childEl = document.createElement('div')
  224. el.appendChild(childEl)
  225. var parentVm = new Vue({
  226. el: el,
  227. attached: spy,
  228. detached: spy2
  229. })
  230. var childVm = parentVm.$addChild({
  231. el: childEl,
  232. attached: spy,
  233. detached: spy2
  234. })
  235. parentVm.$appendTo(document.body)
  236. expect(spy.calls.count()).toBe(2)
  237. // detach child first
  238. childVm.$remove()
  239. expect(spy2.calls.count()).toBe(1)
  240. // should only fire parent detach
  241. parentVm.$remove()
  242. expect(spy2.calls.count()).toBe(2)
  243. })
  244. it('should not fire on detached child', function () {
  245. var el = document.createElement('div')
  246. var childEl = document.createElement('div')
  247. var parentVm = new Vue({
  248. el: el,
  249. attached: spy
  250. })
  251. var childVm = parentVm.$addChild({
  252. el: childEl,
  253. attached: spy
  254. })
  255. parentVm.$appendTo(document.body)
  256. expect(spy.calls.count()).toBe(1)
  257. childVm.$appendTo(el)
  258. expect(spy.calls.count()).toBe(2)
  259. })
  260. })
  261. }
  262. })
  263. })