model-component.spec.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import Vue from 'vue'
  2. describe('Directive v-model component', () => {
  3. it('should work', done => {
  4. const vm = new Vue({
  5. data: {
  6. msg: 'hello'
  7. },
  8. template: `
  9. <div>
  10. <p>{{ msg }}</p>
  11. <test v-model="msg"></test>
  12. </div>
  13. `,
  14. components: {
  15. test: {
  16. props: ['value'],
  17. template: `<input :value="value" @input="$emit('input', $event.target.value)">`
  18. }
  19. }
  20. }).$mount()
  21. document.body.appendChild(vm.$el)
  22. waitForUpdate(() => {
  23. const input = vm.$el.querySelector('input')
  24. input.value = 'world'
  25. triggerEvent(input, 'input')
  26. }).then(() => {
  27. expect(vm.msg).toEqual('world')
  28. expect(vm.$el.querySelector('p').textContent).toEqual('world')
  29. vm.msg = 'changed'
  30. }).then(() => {
  31. expect(vm.$el.querySelector('p').textContent).toEqual('changed')
  32. expect(vm.$el.querySelector('input').value).toEqual('changed')
  33. }).then(() => {
  34. document.body.removeChild(vm.$el)
  35. }).then(done)
  36. })
  37. it('should support customization via model option', done => {
  38. const spy = jasmine.createSpy('update')
  39. const vm = new Vue({
  40. data: {
  41. msg: 'hello'
  42. },
  43. methods: {
  44. spy
  45. },
  46. template: `
  47. <div>
  48. <p>{{ msg }}</p>
  49. <test v-model="msg" @update="spy"></test>
  50. </div>
  51. `,
  52. components: {
  53. test: {
  54. model: {
  55. prop: 'currentValue',
  56. event: 'update'
  57. },
  58. props: ['currentValue'],
  59. template: `<input :value="currentValue" @input="$emit('update', $event.target.value)">`
  60. }
  61. }
  62. }).$mount()
  63. document.body.appendChild(vm.$el)
  64. waitForUpdate(() => {
  65. const input = vm.$el.querySelector('input')
  66. input.value = 'world'
  67. triggerEvent(input, 'input')
  68. }).then(() => {
  69. expect(vm.msg).toEqual('world')
  70. expect(vm.$el.querySelector('p').textContent).toEqual('world')
  71. expect(spy).toHaveBeenCalledWith('world')
  72. vm.msg = 'changed'
  73. }).then(() => {
  74. expect(vm.$el.querySelector('p').textContent).toEqual('changed')
  75. expect(vm.$el.querySelector('input').value).toEqual('changed')
  76. }).then(() => {
  77. document.body.removeChild(vm.$el)
  78. }).then(done)
  79. })
  80. it('modifier: .number', () => {
  81. const vm = new Vue({
  82. template: `<div><my-input ref="input" v-model.number="text"></my-input></div>`,
  83. data: { text: 'foo' },
  84. components: {
  85. 'my-input': {
  86. template: '<input>'
  87. }
  88. }
  89. }).$mount()
  90. expect(vm.text).toBe('foo')
  91. vm.$refs.input.$emit('input', 'bar')
  92. expect(vm.text).toBe('bar')
  93. vm.$refs.input.$emit('input', '123')
  94. expect(vm.text).toBe(123)
  95. })
  96. it('modifier: .trim', () => {
  97. const vm = new Vue({
  98. template: `<div><my-input ref="input" v-model.trim="text"></my-input></div>`,
  99. data: { text: 'foo' },
  100. components: {
  101. 'my-input': {
  102. template: '<input>'
  103. }
  104. }
  105. }).$mount()
  106. expect(vm.text).toBe('foo')
  107. vm.$refs.input.$emit('input', ' bar ')
  108. expect(vm.text).toBe('bar')
  109. vm.$refs.input.$emit('input', ' foo o ')
  110. expect(vm.text).toBe('foo o')
  111. })
  112. })