select.spec.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805
  1. import { createTest, createVue, triggerEvent, destroyVM } from '../util';
  2. import Select from 'packages/select';
  3. describe('Select', () => {
  4. const getSelectVm = (configs = {}, options) => {
  5. ['multiple', 'clearable', 'filterable', 'allowCreate', 'remote', 'collapseTags', 'automaticDropdown'].forEach(config => {
  6. configs[config] = configs[config] || false;
  7. });
  8. configs.multipleLimit = configs.multipleLimit || 0;
  9. if (!options) {
  10. options = [{
  11. value: '选项1',
  12. label: '黄金糕',
  13. disabled: false
  14. }, {
  15. value: '选项2',
  16. label: '双皮奶',
  17. disabled: false
  18. }, {
  19. value: '选项3',
  20. label: '蚵仔煎',
  21. disabled: false
  22. }, {
  23. value: '选项4',
  24. label: '龙须面',
  25. disabled: false
  26. }, {
  27. value: '选项5',
  28. label: '北京烤鸭',
  29. disabled: false
  30. }];
  31. }
  32. const vm = createVue({
  33. template: `
  34. <div>
  35. <el-select
  36. ref="select"
  37. v-model="value"
  38. :multiple="multiple"
  39. :multiple-limit="multipleLimit"
  40. :popper-class="popperClass"
  41. :clearable="clearable"
  42. :filterable="filterable"
  43. :collapse-tags="collapseTags"
  44. :allow-create="allowCreate"
  45. :filterMethod="filterMethod"
  46. :remote="remote"
  47. :loading="loading"
  48. :remoteMethod="remoteMethod"
  49. :automatic-dropdown="automaticDropdown">
  50. <el-option
  51. v-for="item in options"
  52. :label="item.label"
  53. :key="item.value"
  54. :disabled="item.disabled"
  55. :value="item.value">
  56. </el-option>
  57. </el-select>
  58. </div>
  59. `,
  60. data() {
  61. return {
  62. options,
  63. multiple: configs.multiple,
  64. multipleLimit: configs.multipleLimit,
  65. clearable: configs.clearable,
  66. filterable: configs.filterable,
  67. collapseTags: configs.collapseTags,
  68. allowCreate: configs.allowCreate,
  69. popperClass: configs.popperClass,
  70. automaticDropdown: configs.automaticDropdown,
  71. loading: false,
  72. filterMethod: configs.filterMethod && configs.filterMethod(this),
  73. remote: configs.remote,
  74. remoteMethod: configs.remoteMethod && configs.remoteMethod(this),
  75. value: configs.multiple ? [] : ''
  76. };
  77. }
  78. }, true);
  79. return vm;
  80. };
  81. let vm;
  82. afterEach(() => {
  83. destroyVM(vm);
  84. });
  85. it('create', () => {
  86. vm = createTest(Select, true);
  87. expect(vm.$el.className).to.equal('el-select');
  88. expect(vm.$el.querySelector('.el-input__inner').placeholder).to.equal('请选择');
  89. vm.toggleMenu();
  90. expect(vm.visible).to.true;
  91. });
  92. it('options rendered correctly', () => {
  93. vm = getSelectVm();
  94. const options = vm.$el.querySelectorAll('.el-select-dropdown__item');
  95. const result = [].every.call(options, (option, index) => {
  96. let text = option.querySelector('span').textContent;
  97. return text === vm.options[index].label;
  98. });
  99. expect(result).to.true;
  100. });
  101. it('custom dropdown class', () => {
  102. vm = getSelectVm({ popperClass: 'custom-dropdown' });
  103. const dropdown = vm.$el.querySelector('.el-select-dropdown');
  104. expect(dropdown.classList.contains('custom-dropdown')).to.true;
  105. });
  106. it('default value', done => {
  107. vm = createVue({
  108. template: `
  109. <div>
  110. <el-select v-model="value">
  111. <el-option
  112. v-for="item in options"
  113. :label="item.label"
  114. :key="item.value"
  115. :value="item.value">
  116. </el-option>
  117. </el-select>
  118. </div>
  119. `,
  120. data() {
  121. return {
  122. options: [{
  123. value: '选项1',
  124. label: '黄金糕'
  125. }, {
  126. value: '选项2',
  127. label: '双皮奶'
  128. }],
  129. value: '选项2'
  130. };
  131. }
  132. }, true);
  133. setTimeout(() => {
  134. expect(vm.$el.querySelector('.el-input__inner').value).to.equal('双皮奶');
  135. done();
  136. }, 100);
  137. });
  138. it('single select', done => {
  139. vm = createVue({
  140. template: `
  141. <div>
  142. <el-select v-model="value" @change="handleChange">
  143. <el-option
  144. v-for="item in options"
  145. :label="item.label"
  146. :key="item.value"
  147. :value="item.value">
  148. <p>{{item.label}} {{item.value}}</p>
  149. </el-option>
  150. </el-select>
  151. </div>
  152. `,
  153. data() {
  154. return {
  155. options: [{
  156. value: '选项1',
  157. label: '黄金糕'
  158. }, {
  159. value: '选项2',
  160. label: '双皮奶'
  161. }, {
  162. value: '选项3',
  163. label: '蚵仔煎'
  164. }, {
  165. value: '选项4',
  166. label: '龙须面'
  167. }, {
  168. value: '选项5',
  169. label: '北京烤鸭'
  170. }],
  171. value: '',
  172. count: 0
  173. };
  174. },
  175. methods: {
  176. handleChange() {
  177. this.count++;
  178. }
  179. }
  180. }, true);
  181. const options = vm.$el.querySelectorAll('.el-select-dropdown__item');
  182. expect(vm.value).to.equal('');
  183. triggerEvent(options[2], 'mouseenter');
  184. options[2].click();
  185. setTimeout(() => {
  186. expect(vm.value).to.equal('选项3');
  187. expect(vm.count).to.equal(1);
  188. triggerEvent(options[2], 'mouseenter');
  189. options[4].click();
  190. setTimeout(() => {
  191. expect(vm.value).to.equal('选项5');
  192. expect(vm.count).to.equal(2);
  193. done();
  194. }, 100);
  195. }, 100);
  196. });
  197. it('disabled option', done => {
  198. vm = getSelectVm();
  199. vm.options[1].disabled = true;
  200. setTimeout(() => {
  201. const options = vm.$el.querySelectorAll('.el-select-dropdown__item');
  202. expect(options[1].classList.contains('is-disabled')).to.true;
  203. options[1].click();
  204. setTimeout(() => {
  205. expect(vm.value).to.equal('');
  206. done();
  207. }, 100);
  208. }, 100);
  209. });
  210. it('disabled select', () => {
  211. vm = createTest(Select, { disabled: true }, true);
  212. expect(vm.$el.querySelector('.el-input').classList.contains('is-disabled')).to.true;
  213. });
  214. it('visible event', done => {
  215. vm = createVue({
  216. template: `
  217. <div>
  218. <el-select v-model="value" @visible-change="handleVisibleChange">
  219. <el-option
  220. v-for="item in options"
  221. :label="item.label"
  222. :key="item.value"
  223. :value="item.value">
  224. </el-option>
  225. </el-select>
  226. </div>
  227. `,
  228. data() {
  229. return {
  230. options: [],
  231. value: '',
  232. visible: ''
  233. };
  234. },
  235. methods: {
  236. handleVisibleChange(val) {
  237. this.visible = val;
  238. }
  239. }
  240. }, true);
  241. vm.$children[0].visible = true;
  242. setTimeout(() => {
  243. expect(vm.visible).to.true;
  244. done();
  245. }, 50);
  246. });
  247. it('keyboard operations', done => {
  248. vm = getSelectVm();
  249. const select = vm.$children[0];
  250. let i = 8;
  251. while (i--) {
  252. select.navigateOptions('next');
  253. }
  254. select.navigateOptions('prev');
  255. setTimeout(() => {
  256. expect(select.hoverIndex).to.equal(0);
  257. select.selectOption();
  258. setTimeout(() => {
  259. expect(select.value).to.equal('选项1');
  260. done();
  261. }, 100);
  262. }, 100);
  263. });
  264. it('clearable', done => {
  265. vm = getSelectVm({ clearable: true });
  266. const select = vm.$children[0];
  267. vm.value = '选项1';
  268. select.inputHovering = true;
  269. setTimeout(() => {
  270. const icon = vm.$el.querySelector('.el-input__icon');
  271. expect(icon.classList.contains('el-icon-circle-close')).to.true;
  272. icon.click();
  273. expect(vm.value).to.equal('');
  274. done();
  275. }, 100);
  276. });
  277. it('object typed value', done => {
  278. vm = createVue({
  279. template: `
  280. <div>
  281. <el-select v-model="value" value-key="id">
  282. <el-option
  283. v-for="item in options"
  284. :label="item.label"
  285. :key="item.id"
  286. :value="item">
  287. </el-option>
  288. </el-select>
  289. </div>
  290. `,
  291. data() {
  292. return {
  293. options: [{
  294. id: 1,
  295. label: 'label1'
  296. }, {
  297. id: 2,
  298. label: 'label2'
  299. }],
  300. value: {
  301. id: 1,
  302. label: 'label1'
  303. }
  304. };
  305. }
  306. }, true);
  307. setTimeout(() => {
  308. expect(vm.$el.querySelector('.el-input__inner').value).to.equal('label1');
  309. expect(vm.$el.querySelector('.el-select-dropdown__item').classList.contains('selected'));
  310. done();
  311. }, 100);
  312. });
  313. it('custom el-option template', () => {
  314. vm = createVue({
  315. template: `
  316. <div>
  317. <el-select v-model="value">
  318. <el-option
  319. v-for="item in options"
  320. :label="item.label"
  321. :key="item.value"
  322. :value="item.value">
  323. <p>{{item.label}} {{item.value}}</p>
  324. </el-option>
  325. </el-select>
  326. </div>
  327. `,
  328. data() {
  329. return {
  330. options: [{
  331. value: 'value',
  332. label: 'label'
  333. }],
  334. value: ''
  335. };
  336. }
  337. }, true);
  338. expect(vm.$el.querySelector('.el-select-dropdown__item p').textContent).to.equal('label value');
  339. });
  340. it('option group', () => {
  341. vm = createVue({
  342. template: `
  343. <div>
  344. <el-select v-model="value">
  345. <el-option-group
  346. v-for="group in options"
  347. :key="group.label"
  348. :disabled="group.disabled"
  349. :label="group.label">
  350. <el-option
  351. v-for="item in group.options"
  352. :label="item.label"
  353. :key="item.value"
  354. :value="item.value">
  355. </el-option>
  356. </el-option-group>
  357. </el-select>
  358. </div>
  359. `,
  360. data() {
  361. return {
  362. options: [{
  363. label: '热门城市',
  364. options: [{
  365. value: 'Shanghai',
  366. label: '上海'
  367. }, {
  368. value: 'Beijing',
  369. label: '北京'
  370. }]
  371. }, {
  372. label: '城市名',
  373. disabled: true,
  374. options: [{
  375. value: 'Chengdu',
  376. label: '成都'
  377. }, {
  378. value: 'Shenzhen',
  379. label: '深圳'
  380. }, {
  381. value: 'Guangzhou',
  382. label: '广州'
  383. }, {
  384. value: 'Dalian',
  385. label: '大连'
  386. }]
  387. }],
  388. value: ''
  389. };
  390. }
  391. }, true);
  392. const groups = vm.$el.querySelectorAll('.el-select-group__wrap');
  393. const options = groups[1].querySelectorAll('.el-select-dropdown__item');
  394. expect(groups.length).to.equal(2);
  395. expect(options.length).to.equal(4);
  396. expect(options[0].querySelector('span').textContent).to.equal('成都');
  397. });
  398. it('filterable', done => {
  399. vm = getSelectVm({ filterable: true });
  400. const select = vm.$children[0];
  401. setTimeout(() => {
  402. select.selectedLabel = '面';
  403. select.onInputChange();
  404. select.visible = true;
  405. setTimeout(() => {
  406. expect(select.filteredOptionsCount).to.equal(1);
  407. done();
  408. }, 10);
  409. }, 10);
  410. });
  411. it('filterable with custom filter-method', done => {
  412. const filterMethod = vm => {
  413. return query => {
  414. vm.options = vm.options.filter(option => option.label.indexOf(query) === -1);
  415. };
  416. };
  417. vm = getSelectVm({ filterable: true, filterMethod });
  418. const select = vm.$children[0];
  419. select.$el.click();
  420. setTimeout(() => {
  421. select.selectedLabel = '面';
  422. select.onInputChange();
  423. setTimeout(() => {
  424. expect(select.filteredOptionsCount).to.equal(4);
  425. done();
  426. }, 10);
  427. }, 10);
  428. });
  429. it('default-first-option', done => {
  430. vm = createVue({
  431. template: `
  432. <div>
  433. <el-select
  434. v-model="value"
  435. default-first-option
  436. filterable
  437. >
  438. <el-option
  439. v-for="item in options"
  440. :label="item"
  441. :key="item"
  442. :value="item"
  443. />
  444. </el-select>
  445. </div>
  446. `,
  447. data() {
  448. return {
  449. options: ['1', '2', '3', '4', '5'],
  450. value: ''
  451. };
  452. }
  453. }, true);
  454. const select = vm.$children[0];
  455. setTimeout(() => {
  456. select.$el.click();
  457. select.query = '3';
  458. select.handleQueryChange('3');
  459. select.selectOption();
  460. setTimeout(() => {
  461. expect(select.value).to.equal('3');
  462. done();
  463. }, 10);
  464. }, 10);
  465. });
  466. it('allow create', done => {
  467. vm = getSelectVm({ filterable: true, allowCreate: true });
  468. const select = vm.$children[0];
  469. select.$el.querySelector('input').focus();
  470. setTimeout(() => {
  471. select.selectedLabel = 'new';
  472. select.onInputChange();
  473. setTimeout(() => {
  474. const options = document.querySelectorAll('.el-select-dropdown__item span');
  475. const target = [].filter.call(options, option => option.innerText === 'new');
  476. target[0].click();
  477. setTimeout(() => {
  478. expect(select.value.indexOf('new') > -1).to.true;
  479. done();
  480. }, 10);
  481. }, 10);
  482. }, 10);
  483. });
  484. it('multiple select', done => {
  485. vm = getSelectVm({ multiple: true });
  486. const options = vm.$el.querySelectorAll('.el-select-dropdown__item');
  487. vm.value = ['选项1'];
  488. setTimeout(() => {
  489. options[1].click();
  490. setTimeout(() => {
  491. options[3].click();
  492. setTimeout(() => {
  493. expect(vm.value.indexOf('选项2') > -1 && vm.value.indexOf('选项4') > -1).to.true;
  494. const tagCloseIcons = vm.$el.querySelectorAll('.el-tag__close');
  495. tagCloseIcons[0].click();
  496. setTimeout(() => {
  497. expect(vm.value.indexOf('选项1')).to.equal(-1);
  498. done();
  499. }, 100);
  500. }, 100);
  501. }, 100);
  502. }, 100);
  503. });
  504. it('multiple remove-tag', done => {
  505. sinon.stub(window.console, 'log');
  506. vm = createVue({
  507. template: `
  508. <div>
  509. <el-select v-model="value" multiple @remove-tag="handleRemoveTag">
  510. <el-option
  511. v-for="item in options"
  512. :label="item.label"
  513. :key="item.value"
  514. :value="item.value">
  515. <p>{{item.label}} {{item.value}}</p>
  516. </el-option>
  517. </el-select>
  518. </div>
  519. `,
  520. data() {
  521. return {
  522. options: [{
  523. value: '选项1',
  524. label: '黄金糕'
  525. }, {
  526. value: '选项2',
  527. label: '双皮奶'
  528. }, {
  529. value: '选项3',
  530. label: '蚵仔煎'
  531. }, {
  532. value: '选项4',
  533. label: '龙须面'
  534. }, {
  535. value: '选项5',
  536. label: '北京烤鸭'
  537. }],
  538. value: ['选项1', '选项3']
  539. };
  540. },
  541. methods: {
  542. handleRemoveTag() {
  543. console.log('remove tag');
  544. }
  545. }
  546. }, true);
  547. expect(vm.value.length).to.equal(2);
  548. setTimeout(() => {
  549. const tagCloseIcons = vm.$el.querySelectorAll('.el-tag__close');
  550. tagCloseIcons[1].click();
  551. setTimeout(() => {
  552. expect(vm.value.length).to.equal(1);
  553. expect(window.console.log.callCount).to.equal(1);
  554. tagCloseIcons[0].click();
  555. setTimeout(() => {
  556. expect(vm.value.length).to.equal(0);
  557. expect(window.console.log.callCount).to.equal(2);
  558. window.console.log.restore();
  559. done();
  560. }, 50);
  561. }, 50);
  562. }, 50);
  563. });
  564. it('multiple limit', done => {
  565. vm = getSelectVm({ multiple: true, multipleLimit: 1 });
  566. const options = vm.$el.querySelectorAll('.el-select-dropdown__item');
  567. options[1].click();
  568. setTimeout(() => {
  569. expect(vm.value.indexOf('选项2') > -1).to.true;
  570. options[3].click();
  571. setTimeout(() => {
  572. expect(vm.value.indexOf('选项4')).to.equal(-1);
  573. done();
  574. }, 50);
  575. }, 50);
  576. });
  577. it('multiple remote search', done => {
  578. const remoteMethod = vm => {
  579. return query => {
  580. vm.loading = true;
  581. setTimeout(() => {
  582. vm.options = vm.options.filter(option => {
  583. return option.label.indexOf(query) > -1;
  584. });
  585. vm.loading = false;
  586. }, 200);
  587. };
  588. };
  589. vm = getSelectVm({
  590. multiple: true,
  591. remote: true,
  592. filterable: true,
  593. remoteMethod
  594. });
  595. const select = vm.$children[0];
  596. select.handleQueryChange('');
  597. vm.$nextTick(() => {
  598. select.handleQueryChange('面');
  599. setTimeout(() => {
  600. expect(select.filteredOptionsCount).to.equal(1);
  601. select.options[0].$el.click();
  602. vm.$nextTick(() => {
  603. expect(vm.value[0]).to.equal('选项4');
  604. select.deletePrevTag({ target: select.$refs.input });
  605. select.deletePrevTag({ target: select.$refs.input });
  606. select.resetInputState({ keyCode: 1 });
  607. vm.$nextTick(() => {
  608. expect(vm.value.length).to.equal(0);
  609. done();
  610. });
  611. });
  612. }, 250);
  613. });
  614. });
  615. it('event:focus & blur', done => {
  616. vm = createVue({
  617. template: `
  618. <el-select ref="select"></el-select>
  619. `
  620. }, true);
  621. const spyFocus = sinon.spy();
  622. const spyBlur = sinon.spy();
  623. vm.$refs.select.$on('focus', spyFocus);
  624. vm.$refs.select.$on('blur', spyBlur);
  625. vm.$el.querySelector('input').focus();
  626. vm.$el.querySelector('input').blur();
  627. vm.$nextTick(_ => {
  628. expect(spyFocus.calledOnce).to.be.true;
  629. expect(spyBlur.calledOnce).to.be.true;
  630. done();
  631. });
  632. });
  633. it('should return focus to input inside select after option select', done => {
  634. vm = createVue({
  635. template: `
  636. <div>
  637. <el-select v-model="value" ref="select">
  638. <el-option label="1" :value="1" />
  639. </el-select>
  640. </div>
  641. `,
  642. data() {
  643. return {
  644. value: ''
  645. };
  646. }
  647. }, true);
  648. const spyInputFocus = sinon.spy();
  649. const spySelectFocus = sinon.spy();
  650. vm.$refs.select.$on('focus', spySelectFocus);
  651. vm.$refs.select.$refs.reference.$on('focus', spyInputFocus);
  652. const option = vm.$el.querySelectorAll('.el-select-dropdown__item')[0];
  653. triggerEvent(option, 'mouseenter');
  654. option.click();
  655. vm.$nextTick(_ => {
  656. expect(spyInputFocus.calledOnce).to.be.true;
  657. expect(spySelectFocus.calledOnce).not.to.be.true;
  658. done();
  659. });
  660. });
  661. it('should not open popper when automatic-dropdown not set', done => {
  662. vm = getSelectVm();
  663. vm.$refs.select.$refs.reference.$refs.input.focus();
  664. vm.$nextTick(_ => {
  665. expect(vm.$refs.select.visible).to.be.false;
  666. done();
  667. });
  668. });
  669. it('should open popper when automatic-dropdown is set', done => {
  670. vm = getSelectVm({ automaticDropdown: true });
  671. vm.$refs.select.$refs.reference.$refs.input.focus();
  672. vm.$nextTick(_ => {
  673. expect(vm.$refs.select.visible).to.be.true;
  674. done();
  675. });
  676. });
  677. it('focus', done => {
  678. vm = createVue({
  679. template: `
  680. <el-select ref="select"></el-select>
  681. `
  682. }, true);
  683. const spy = sinon.spy();
  684. vm.$refs.select.$on('focus', spy);
  685. vm.$refs.select.focus();
  686. vm.$nextTick(_ => {
  687. expect(spy.calledOnce).to.be.true;
  688. done();
  689. });
  690. });
  691. it('only emit change on user input', done => {
  692. let callCount = 0;
  693. vm = createVue({
  694. template: `
  695. <div>
  696. <el-select v-model="value" @change="change" ref="select">
  697. <el-option label="1" :value="1" />
  698. <el-option label="2" :value="2" />
  699. <el-option label="3" :value="3" />
  700. </el-select>
  701. </div>
  702. `,
  703. data() {
  704. return {
  705. value: 1,
  706. change: () => ++callCount
  707. };
  708. }
  709. });
  710. vm.value = 2;
  711. setTimeout(() => {
  712. expect(callCount).to.equal(0);
  713. const options = vm.$el.querySelectorAll('.el-select-dropdown__item');
  714. triggerEvent(options[2], 'mouseenter');
  715. options[2].click();
  716. setTimeout(() => {
  717. expect(callCount).to.equal(1);
  718. done();
  719. }, 10);
  720. }, 10);
  721. });
  722. describe('resetInputHeight', () => {
  723. const getSelectComponentVm = (configs) => {
  724. vm = getSelectVm(configs || {});
  725. return vm.$refs.select;
  726. };
  727. it('should reset height if collapse-tags option is disabled', () => {
  728. const select = getSelectComponentVm();
  729. sinon.stub(select, '$nextTick');
  730. select.resetInputHeight();
  731. expect(select.$nextTick.callCount).to.equal(1);
  732. });
  733. it('should not reset height if collapse-tags option is enabled', () => {
  734. const select = getSelectComponentVm({ collapseTags: true });
  735. sinon.stub(select, '$nextTick');
  736. select.resetInputHeight();
  737. expect(select.$nextTick.callCount).to.equal(0);
  738. });
  739. it('should reset height if both collapse-tags and filterable are enabled', () => {
  740. const select = getSelectComponentVm({ collapseTags: true, filterable: true });
  741. sinon.stub(select, '$nextTick');
  742. select.resetInputHeight();
  743. expect(select.$nextTick.callCount).to.equal(1);
  744. });
  745. });
  746. });