2
0

events_spec.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  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. expect(this._data).toBeNull()
  141. spy()
  142. }
  143. })
  144. vm.$destroy()
  145. expect(spy).toHaveBeenCalled()
  146. })
  147. if (Vue.util.inBrowser) {
  148. it('beforeCompile', function () {
  149. var vm = new Vue({
  150. template: '{{a}}',
  151. data: { a: 1 },
  152. beforeCompile: function () {
  153. expect(this).toBe(vm)
  154. expect(this.$el).toBe(el)
  155. expect(this.$el.textContent).toBe('{{a}}')
  156. spy()
  157. }
  158. })
  159. var el = document.createElement('div')
  160. vm.$mount(el)
  161. expect(spy).toHaveBeenCalled()
  162. })
  163. it('compiled', function () {
  164. var vm = new Vue({
  165. template: '{{a}}',
  166. data: { a: 1 },
  167. compiled: function () {
  168. expect(this.$el).toBe(el)
  169. expect(this.$el.textContent).toBe('1')
  170. spy()
  171. }
  172. })
  173. var el = document.createElement('div')
  174. vm.$mount(el)
  175. expect(spy).toHaveBeenCalled()
  176. })
  177. it('ready', function () {
  178. var vm = new Vue({
  179. ready: spy
  180. })
  181. expect(spy).not.toHaveBeenCalled()
  182. var el = document.createElement('div')
  183. vm.$mount(el)
  184. expect(spy).not.toHaveBeenCalled()
  185. vm.$appendTo(document.body)
  186. expect(spy).toHaveBeenCalled()
  187. vm.$remove()
  188. // try mounting on something already in dom
  189. el = document.createElement('div')
  190. document.body.appendChild(el)
  191. vm = new Vue({
  192. el: el,
  193. ready: spy2
  194. })
  195. expect(spy2).toHaveBeenCalled()
  196. vm.$remove()
  197. })
  198. describe('attached/detached', function () {
  199. it('in DOM', function () {
  200. var el = document.createElement('div')
  201. var childEl = document.createElement('div')
  202. el.appendChild(childEl)
  203. document.body.appendChild(el)
  204. var parentVm = new Vue({
  205. el: el,
  206. attached: spy,
  207. detached: spy2
  208. })
  209. var childVm = parentVm.$addChild({
  210. el: childEl,
  211. attached: spy,
  212. detached: spy2
  213. })
  214. expect(spy.calls.count()).toBe(2)
  215. parentVm.$remove()
  216. expect(spy2.calls.count()).toBe(2)
  217. // child should be already detached
  218. // so the hook should not fire again
  219. childVm.$remove()
  220. expect(spy2.calls.count()).toBe(2)
  221. })
  222. it('create then attach', function () {
  223. var el = document.createElement('div')
  224. var childEl = document.createElement('div')
  225. el.appendChild(childEl)
  226. var parentVm = new Vue({
  227. el: el,
  228. attached: spy,
  229. detached: spy2
  230. })
  231. var childVm = parentVm.$addChild({
  232. el: childEl,
  233. attached: spy,
  234. detached: spy2
  235. })
  236. parentVm.$appendTo(document.body)
  237. expect(spy.calls.count()).toBe(2)
  238. // detach child first
  239. childVm.$remove()
  240. expect(spy2.calls.count()).toBe(1)
  241. // should only fire parent detach
  242. parentVm.$remove()
  243. expect(spy2.calls.count()).toBe(2)
  244. })
  245. it('should not fire on detached child', function () {
  246. var el = document.createElement('div')
  247. var childEl = document.createElement('div')
  248. var parentVm = new Vue({
  249. el: el,
  250. attached: spy
  251. })
  252. var childVm = parentVm.$addChild({
  253. el: childEl,
  254. attached: spy
  255. })
  256. parentVm.$appendTo(document.body)
  257. expect(spy.calls.count()).toBe(1)
  258. childVm.$appendTo(el)
  259. expect(spy.calls.count()).toBe(2)
  260. })
  261. })
  262. }
  263. })
  264. })