sync.spec.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import { createVue, triggerEvent } from '../util';
  2. import Sync from 'element-ui/src/utils/sync';
  3. const Test = {
  4. template: `<div class="sync-test" v-show="visible">
  5. <button @click="visible = false">Hide</button>
  6. A test component.
  7. </div>`,
  8. data() {
  9. return {
  10. visible: true
  11. };
  12. }
  13. };
  14. describe('Sync', () => {
  15. it('should not throw when use incorrectly', () => {
  16. sinon.stub(window.console, 'warn');
  17. createVue({
  18. template: `
  19. <test v-sync>
  20. </test>
  21. `,
  22. components: { Test },
  23. directives: { Sync },
  24. data() {
  25. return {
  26. myVisible: true
  27. };
  28. }
  29. });
  30. expect(window.console.warn.callCount).to.equal(1);
  31. createVue({
  32. template: `
  33. <test v-sync:visible>
  34. </test>
  35. `,
  36. components: { Test },
  37. directives: { Sync },
  38. data() {
  39. return {
  40. myVisible: true
  41. };
  42. }
  43. });
  44. expect(window.console.warn.callCount).to.equal(2);
  45. createVue({
  46. template: `
  47. <test v-sync.visible>
  48. </test>
  49. `,
  50. components: { Test },
  51. directives: { Sync },
  52. data() {
  53. return {
  54. myVisible: true
  55. };
  56. }
  57. });
  58. expect(window.console.warn.callCount).to.equal(3);
  59. createVue({
  60. template: `
  61. <div v-sync:visible="myVisible">
  62. </div>
  63. `,
  64. components: { Test },
  65. directives: { Sync },
  66. data() {
  67. return {
  68. myVisible: true
  69. };
  70. }
  71. });
  72. expect(window.console.warn.callCount).to.equal(4);
  73. window.console.warn.restore();
  74. });
  75. it('context variable should change when inner component variable change', (done) => {
  76. const vm = createVue({
  77. template: `
  78. <test v-sync:visible="myVisible">
  79. </test>
  80. `,
  81. components: { Test },
  82. directives: { Sync },
  83. data() {
  84. return {
  85. myVisible: true
  86. };
  87. }
  88. }, true);
  89. triggerEvent(vm.$el.querySelector('.sync-test button'), 'click', {});
  90. setTimeout(() => {
  91. expect(vm.myVisible).to.be.false;
  92. done();
  93. }, 10);
  94. });
  95. it('inner component variable should change when context variable change', (done) => {
  96. const vm = createVue({
  97. template: `
  98. <test ref="test" v-sync:visible="myVisible">
  99. </test>
  100. `,
  101. components: { Test },
  102. directives: { Sync },
  103. data() {
  104. return {
  105. myVisible: true
  106. };
  107. }
  108. }, true);
  109. vm.myVisible = false;
  110. setTimeout(() => {
  111. expect(vm.$refs.test.visible).to.be.false;
  112. expect(vm.$refs.test.$el.style.display).to.equal('none');
  113. done();
  114. }, 10);
  115. });
  116. it('should unwatch expression after destroy', () => {
  117. const vm = createVue({
  118. template: `
  119. <test ref="test" v-sync:visible="myVisible" v-if="createTest">
  120. </test>
  121. `,
  122. components: { Test },
  123. directives: { Sync },
  124. data() {
  125. return {
  126. myVisible: true,
  127. createTest: false
  128. };
  129. }
  130. });
  131. const beforeBindCount = vm._watchers.length;
  132. vm.createTest = true;
  133. const delay = 50;
  134. setTimeout(() => {
  135. const afterBindCount = vm._watchers.length;
  136. expect(afterBindCount).to.be.equal(beforeBindCount + 1);
  137. vm.createTest = false;
  138. setTimeout(() => {
  139. const afterDestroyCount = vm._watchers.length;
  140. expect(afterDestroyCount).to.be.equal(beforeBindCount);
  141. }, delay);
  142. }, delay);
  143. });
  144. });