directive_spec.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. var Vue = require('../../../src/vue')
  2. var Directive = require('../../../src/directive')
  3. var nextTick = Vue.nextTick
  4. describe('Directive', function () {
  5. var el = {} // simply a mock to be able to run in Node
  6. var vm, def
  7. beforeEach(function () {
  8. def = {
  9. bind: jasmine.createSpy('bind'),
  10. update: jasmine.createSpy('update'),
  11. unbind: jasmine.createSpy('unbind')
  12. }
  13. vm = new Vue({
  14. data:{
  15. a:1
  16. },
  17. filters: {
  18. test: function (v) {
  19. return v * 2
  20. }
  21. },
  22. directives: {
  23. test: def
  24. }
  25. })
  26. })
  27. it('normal', function (done) {
  28. var d = new Directive('test', el, vm, {
  29. expression: 'a',
  30. arg: 'someArg',
  31. filters: [{name:'test'}]
  32. }, def)
  33. // properties
  34. expect(d.el).toBe(el)
  35. expect(d.name).toBe('test')
  36. expect(d.vm).toBe(vm)
  37. expect(d.arg).toBe('someArg')
  38. expect(d.expression).toBe('a')
  39. // init calls
  40. expect(def.bind).toHaveBeenCalled()
  41. expect(def.update).toHaveBeenCalledWith(2)
  42. expect(d._bound).toBe(true)
  43. // update
  44. vm.a = 2
  45. nextTick(function () {
  46. expect(def.update).toHaveBeenCalledWith(4, 2)
  47. // teardown
  48. d._teardown()
  49. expect(def.unbind).toHaveBeenCalled()
  50. expect(d._bound).toBe(false)
  51. expect(d._watcher).toBe(null)
  52. done()
  53. })
  54. })
  55. it('static literal', function () {
  56. def.isLiteral = true
  57. var d = new Directive('test', el, vm, {
  58. expression: 'a'
  59. }, def)
  60. expect(d._watcher).toBeUndefined()
  61. expect(d.expression).toBe('a')
  62. expect(d.bind).toHaveBeenCalled()
  63. expect(d.update).not.toHaveBeenCalled()
  64. })
  65. it('static literal, interpolate with no update', function () {
  66. def.isLiteral = true
  67. delete def.update
  68. var d = new Directive('test', el, vm, {
  69. expression: '{{a}}'
  70. }, def)
  71. expect(d._watcher).toBeUndefined()
  72. expect(d.expression).toBe(1)
  73. expect(d.bind).toHaveBeenCalled()
  74. })
  75. it('dynamic literal', function (done) {
  76. def.isLiteral = true
  77. var d = new Directive('test', el, vm, {
  78. expression: '{{a}}'
  79. }, def)
  80. expect(d._watcher).toBeDefined()
  81. expect(d.expression).toBe(1)
  82. expect(def.bind).toHaveBeenCalled()
  83. expect(def.update).toHaveBeenCalledWith(1)
  84. vm.a = 2
  85. nextTick(function () {
  86. expect(def.update).toHaveBeenCalledWith(2, 1)
  87. done()
  88. })
  89. })
  90. it('expression function', function () {
  91. def.isFn = true
  92. var spy = jasmine.createSpy()
  93. vm.$options.filters.test = function (fn) {
  94. spy()
  95. return function () {
  96. // call it twice
  97. fn()
  98. fn()
  99. }
  100. }
  101. var d = new Directive('test', el, vm, {
  102. expression: 'a++',
  103. filters: [{name:'test'}]
  104. }, def)
  105. expect(d._watcher).toBeUndefined()
  106. expect(d.bind).toHaveBeenCalled()
  107. var wrappedFn = d.update.calls.argsFor(0)[0]
  108. expect(typeof wrappedFn).toBe('function')
  109. // test invoke the wrapped fn
  110. wrappedFn()
  111. expect(vm.a).toBe(3)
  112. })
  113. it('two-way', function (done) {
  114. def.twoWay = true
  115. vm.$options.filters.test = {
  116. write: function (v) {
  117. return v * 3
  118. }
  119. }
  120. var d = new Directive('test', el, vm, {
  121. expression: 'a',
  122. filters: [{name:'test'}]
  123. }, def)
  124. d.set(2)
  125. expect(vm.a).toBe(6)
  126. nextTick(function () {
  127. expect(def.update.calls.count()).toBe(2)
  128. expect(def.update).toHaveBeenCalledWith(6, 1)
  129. // locked set
  130. d.set(3, true)
  131. expect(vm.a).toBe(9)
  132. nextTick(function () {
  133. // should have no update calls
  134. expect(def.update.calls.count()).toBe(2)
  135. done()
  136. })
  137. })
  138. })
  139. it('function def', function () {
  140. var d = new Directive('test', el, vm, {
  141. expression: 'a'
  142. }, def.update)
  143. expect(d.update).toBe(def.update)
  144. expect(def.update).toHaveBeenCalled()
  145. })
  146. it('reuse the same watcher', function (done) {
  147. var d = new Directive('test', el, vm, {
  148. expression: 'a',
  149. }, def)
  150. var d2 = new Directive('test', el, vm, {
  151. expression: 'a',
  152. }, def)
  153. expect(vm._watcherList.length).toBe(1)
  154. expect(d._watcher).toBe(d2._watcher)
  155. d2._teardown()
  156. expect(d2._watcher).toBeNull()
  157. expect(vm._watcherList.length).toBe(1)
  158. vm.a = 2
  159. nextTick(function () {
  160. expect(def.update).toHaveBeenCalledWith(2, 1)
  161. d._teardown()
  162. expect(vm._watcherList.length).toBe(0)
  163. done()
  164. })
  165. })
  166. })