sync.spec.js 3.1 KB

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