form.spec.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865
  1. import { createVue, destroyVM } from '../util';
  2. const DELAY = 50;
  3. describe('Form', () => {
  4. let vm;
  5. let hasPromise = true;
  6. before(() => {
  7. if (!window.Promise) {
  8. hasPromise = false;
  9. window.Promise = require('es6-promise').Promise;
  10. }
  11. });
  12. after(() => {
  13. if (!hasPromise) {
  14. window.Promise = undefined;
  15. }
  16. });
  17. afterEach(() => {
  18. destroyVM(vm);
  19. });
  20. it('label width', done => {
  21. vm = createVue({
  22. template: `
  23. <el-form ref="form" :model="form" label-width="80px">
  24. <el-form-item label="活动名称">
  25. <el-input v-model="form.name"></el-input>
  26. </el-form-item>
  27. </el-form>
  28. `,
  29. data() {
  30. return {
  31. form: {
  32. name: ''
  33. }
  34. };
  35. }
  36. }, true);
  37. expect(vm.$el.querySelector('.el-form-item__label').style.width).to.equal('80px');
  38. expect(vm.$el.querySelector('.el-form-item__content').style.marginLeft).to.equal('80px');
  39. done();
  40. });
  41. it('inline form', done => {
  42. vm = createVue({
  43. template: `
  44. <el-form ref="form" :model="form" inline>
  45. <el-form-item>
  46. <el-input v-model="form.name"></el-input>
  47. </el-form-item>
  48. <el-form-item>
  49. <el-input v-model="form.address"></el-input>
  50. </el-form-item>
  51. </el-form>
  52. `,
  53. data() {
  54. return {
  55. form: {
  56. name: '',
  57. address: ''
  58. }
  59. };
  60. }
  61. }, true);
  62. expect(vm.$el.classList.contains('el-form--inline')).to.be.true;
  63. done();
  64. });
  65. it('label position', done => {
  66. vm = createVue({
  67. template: `
  68. <div>
  69. <el-form :model="form" label-position="top" ref="labelTop">
  70. <el-form-item>
  71. <el-input v-model="form.name"></el-input>
  72. </el-form-item>
  73. <el-form-item>
  74. <el-input v-model="form.address"></el-input>
  75. </el-form-item>
  76. </el-form>
  77. <el-form :model="form" label-position="left" ref="labelLeft">
  78. <el-form-item>
  79. <el-input v-model="form.name"></el-input>
  80. </el-form-item>
  81. <el-form-item>
  82. <el-input v-model="form.address"></el-input>
  83. </el-form-item>
  84. </el-form>
  85. </div>
  86. `,
  87. data() {
  88. return {
  89. form: {
  90. name: '',
  91. address: ''
  92. }
  93. };
  94. }
  95. }, true);
  96. expect(vm.$refs.labelTop.$el.classList.contains('el-form--label-top')).to.be.true;
  97. expect(vm.$refs.labelLeft.$el.classList.contains('el-form--label-left')).to.be.true;
  98. done();
  99. });
  100. it('show message', done => {
  101. vm = createVue({
  102. template: `
  103. <el-form :model="form" ref="form">
  104. <el-form-item label="活动名称" prop="name" :show-message="false"
  105. :rules="{
  106. required: true,
  107. message: '请输入活动名称',
  108. trigger: 'change',
  109. min: 3,
  110. max: 6
  111. }"
  112. >
  113. <el-input v-model="form.name"></el-input>
  114. </el-form-item>
  115. </el-form>
  116. `,
  117. data() {
  118. return {
  119. form: {
  120. name: ''
  121. }
  122. };
  123. }
  124. }, true);
  125. vm.$refs.form.validate(valid => {
  126. expect(valid).to.not.true;
  127. vm.$refs.form.$nextTick(_ => {
  128. expect(vm.$el.querySelector('.el-form-item__error')).to.not.exist;
  129. done();
  130. });
  131. });
  132. });
  133. it('reset field', done => {
  134. vm = createVue({
  135. template: `
  136. <el-form ref="form" :model="form" :rules="rules">
  137. <el-form-item label="活动名称" prop="name">
  138. <el-input v-model="form.name" ref="fieldName"></el-input>
  139. </el-form-item>
  140. <el-form-item label="活动地址" prop="address">
  141. <el-input v-model="form.address" ref="fieldAddr"></el-input>
  142. </el-form-item>
  143. <el-form-item label="活动性质" prop="type">
  144. <el-checkbox-group v-model="form.type">
  145. <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
  146. <el-checkbox label="地推活动" name="type"></el-checkbox>
  147. <el-checkbox label="线下主题活动" name="type"></el-checkbox>
  148. <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
  149. </el-checkbox-group>
  150. </el-form-item>
  151. </el-form>
  152. `,
  153. data() {
  154. return {
  155. form: {
  156. name: '',
  157. address: '',
  158. type: []
  159. },
  160. rules: {
  161. name: [
  162. { required: true, message: '请输入活动名称', trigger: 'blur' }
  163. ],
  164. address: [
  165. { required: true, message: '请选择活动区域', trigger: 'change' }
  166. ],
  167. type: [
  168. { type: 'array', required: true, message: '请至少选择一个活动性质', trigger: 'change' }
  169. ]
  170. }
  171. };
  172. },
  173. methods: {
  174. setValue() {
  175. this.form.name = 'jack';
  176. this.form.address = 'aaaa';
  177. this.form.type.push('地推活动');
  178. }
  179. }
  180. }, true);
  181. vm.setValue();
  182. vm.$refs.form.resetFields();
  183. vm.$refs.form.$nextTick(_ => {
  184. expect(vm.form.name).to.equal('');
  185. expect(vm.form.address).to.equal('');
  186. expect(vm.form.type.length).to.equal(0);
  187. done();
  188. });
  189. });
  190. it('form item nest', done => {
  191. vm = createVue({
  192. template: `
  193. <el-form ref="form" :model="form" :rules="rules">
  194. <el-form-item label="活动时间" required>
  195. <el-col :span="11">
  196. <el-form-item prop="date1">
  197. <el-date-picker type="date" placeholder="选择日期" v-model="form.date1" style="width: 100%;"></el-date-picker>
  198. </el-form-item>
  199. </el-col>
  200. <el-col class="line" :span="2">-</el-col>
  201. <el-col :span="11">
  202. <el-form-item prop="date2">
  203. <el-time-picker type="fixed-time" placeholder="选择时间" v-model="form.date2" style="width: 100%;"></el-time-picker>
  204. </el-form-item>
  205. </el-col>
  206. </el-form-item>
  207. </el-form>
  208. `,
  209. data() {
  210. return {
  211. form: {
  212. date1: '',
  213. date2: ''
  214. },
  215. rules: {
  216. date1: [
  217. { type: 'date', required: true, message: '请选择日期', trigger: 'change' }
  218. ]
  219. }
  220. };
  221. },
  222. methods: {
  223. setValue() {
  224. this.name = 'jack';
  225. this.address = 'aaaa';
  226. }
  227. }
  228. }, true);
  229. vm.$refs.form.validate(valid => {
  230. expect(valid).to.not.true;
  231. done();
  232. });
  233. });
  234. describe('validate', () => {
  235. it('input', done => {
  236. vm = createVue({
  237. template: `
  238. <el-form :model="form" :rules="rules" ref="form">
  239. <el-form-item label="活动名称" prop="name" ref="field">
  240. <el-input v-model="form.name"></el-input>
  241. </el-form-item>
  242. </el-form>
  243. `,
  244. data() {
  245. return {
  246. form: {
  247. name: ''
  248. },
  249. rules: {
  250. name: [
  251. { required: true, message: '请输入活动名称', trigger: 'change', min: 3, max: 6 }
  252. ]
  253. }
  254. };
  255. },
  256. methods: {
  257. setValue(value) {
  258. this.form.name = value;
  259. }
  260. }
  261. }, true);
  262. vm.$refs.form.validate(valid => {
  263. let field = vm.$refs.field;
  264. expect(valid).to.not.true;
  265. vm.$refs.form.$nextTick(_ => {
  266. expect(field.validateMessage).to.equal('请输入活动名称');
  267. vm.setValue('aaaaa');
  268. vm.$refs.form.$nextTick(_ => {
  269. expect(field.validateMessage).to.equal('');
  270. vm.setValue('aa');
  271. vm.$refs.form.$nextTick(_ => {
  272. expect(field.validateMessage).to.equal('请输入活动名称');
  273. done();
  274. });
  275. });
  276. });
  277. });
  278. });
  279. it('textarea', done => {
  280. vm = createVue({
  281. template: `
  282. <el-form :model="form" :rules="rules" ref="form">
  283. <el-form-item label="活动名称" prop="name" ref="field">
  284. <el-input type="textarea" v-model="form.name"></el-input>
  285. </el-form-item>
  286. </el-form>
  287. `,
  288. data() {
  289. return {
  290. form: {
  291. name: ''
  292. },
  293. rules: {
  294. name: [
  295. { required: true, message: '请输入活动名称', trigger: 'change', min: 3, max: 6 }
  296. ]
  297. }
  298. };
  299. },
  300. methods: {
  301. setValue(value) {
  302. this.form.name = value;
  303. }
  304. }
  305. }, true);
  306. vm.$refs.form.validate(valid => {
  307. let field = vm.$refs.field;
  308. expect(valid).to.not.true;
  309. vm.$refs.form.$nextTick(_ => {
  310. expect(field.validateMessage).to.equal('请输入活动名称');
  311. vm.setValue('aaaaa');
  312. vm.$refs.form.$nextTick(_ => {
  313. expect(field.validateMessage).to.equal('');
  314. vm.setValue('aa');
  315. vm.$refs.form.$nextTick(_ => {
  316. expect(field.validateMessage).to.equal('请输入活动名称');
  317. done();
  318. });
  319. });
  320. });
  321. });
  322. });
  323. it('selector', done => {
  324. vm = createVue({
  325. template: `
  326. <el-form :model="form" :rules="rules" ref="form">
  327. <el-form-item label="记住密码" prop="region" ref="field">
  328. <el-select v-model="form.region" placeholder="请选择活动区域">
  329. <el-option label="区域一" value="shanghai"></el-option>
  330. <el-option label="区域二" ref="opt" value="beijing"></el-option>
  331. </el-select>
  332. </el-form-item>
  333. </el-form>
  334. `,
  335. data() {
  336. return {
  337. form: {
  338. region: ''
  339. },
  340. rules: {
  341. region: [
  342. {required: true, message: '请选择活动区域', trigger: 'change' }
  343. ]
  344. }
  345. };
  346. }
  347. }, true);
  348. vm.$refs.form.validate(valid => {
  349. let field = vm.$refs.field;
  350. expect(valid).to.false;
  351. setTimeout(_ => {
  352. expect(field.validateMessage).to.equal('请选择活动区域');
  353. // programatic modification of bound value does not triggers change validation
  354. vm.form.region = 'shanghai';
  355. setTimeout(_ => {
  356. expect(field.validateMessage).to.equal('请选择活动区域');
  357. // user modification of bound value triggers change validation
  358. vm.$refs.opt.$el.click();
  359. setTimeout(_ => {
  360. expect(field.validateMessage).to.equal('');
  361. done();
  362. }, 100);
  363. }, 100);
  364. }, 100);
  365. });
  366. });
  367. it('datepicker', done => {
  368. vm = createVue({
  369. template: `
  370. <el-form :model="form" :rules="rules" ref="form">
  371. <el-form-item label="记住密码" prop="date" ref="field">
  372. <el-date-picker type="date" ref="picker" placeholder="选择日期" v-model="form.date" style="width: 100%;"></el-date-picker>
  373. </el-form-item>
  374. </el-form>
  375. `,
  376. data() {
  377. return {
  378. form: {
  379. date: ''
  380. },
  381. rules: {
  382. date: [
  383. {type: 'date', required: true, message: '请选择日期', trigger: 'change' }
  384. ]
  385. }
  386. };
  387. }
  388. }, true);
  389. vm.$refs.form.validate(valid => {
  390. let field = vm.$refs.field;
  391. expect(valid).to.not.true;
  392. setTimeout(_ => {
  393. expect(field.validateMessage).to.equal('请选择日期');
  394. // programatic modification does not trigger change
  395. vm.value = new Date();
  396. setTimeout(_ => {
  397. expect(field.validateMessage).to.equal('请选择日期');
  398. vm.value = '';
  399. // user modification triggers change
  400. const input = vm.$refs.picker.$el.querySelector('input');
  401. input.blur();
  402. input.focus();
  403. setTimeout(_ => {
  404. const keyDown = (el, keyCode) => {
  405. const evt = document.createEvent('Events');
  406. evt.initEvent('keydown', true, true);
  407. evt.keyCode = keyCode;
  408. el.dispatchEvent(evt);
  409. };
  410. keyDown(input, 37);
  411. setTimeout(_ => {
  412. keyDown(input, 13);
  413. setTimeout(_ => {
  414. expect(field.validateMessage).to.equal('');
  415. done();
  416. }, DELAY);
  417. }, DELAY);
  418. }, DELAY);
  419. }, DELAY);
  420. }, DELAY);
  421. });
  422. });
  423. it('timepicker', done => {
  424. vm = createVue({
  425. template: `
  426. <el-form :model="form" :rules="rules" ref="form">
  427. <el-form-item label="记住密码" prop="date" ref="field">
  428. <el-time-picker type="fixed-time" ref="picker" placeholder="选择时间" v-model="form.date" style="width: 100%;"></el-time-picker>
  429. </el-form-item>
  430. </el-form>
  431. `,
  432. data() {
  433. return {
  434. form: {
  435. date: ''
  436. },
  437. rules: {
  438. date: [
  439. {type: 'date', required: true, message: '请选择时间', trigger: 'change' }
  440. ]
  441. }
  442. };
  443. }
  444. }, true);
  445. vm.$refs.form.validate(valid => {
  446. let field = vm.$refs.field;
  447. expect(valid).to.not.true;
  448. setTimeout(_ => {
  449. expect(field.validateMessage).to.equal('请选择时间');
  450. // programatic modification does not trigger change
  451. vm.value = new Date();
  452. setTimeout(_ => {
  453. expect(field.validateMessage).to.equal('请选择时间');
  454. vm.value = '';
  455. // user modification triggers change
  456. const input = vm.$refs.picker.$el.querySelector('input');
  457. input.blur();
  458. input.focus();
  459. setTimeout(_ => {
  460. vm.$refs.picker.picker.$el.querySelector('.confirm').click();
  461. setTimeout(_ => {
  462. expect(field.validateMessage).to.equal('');
  463. done();
  464. }, DELAY);
  465. }, DELAY);
  466. }, DELAY);
  467. }, DELAY);
  468. });
  469. });
  470. it('checkbox', done => {
  471. vm = createVue({
  472. template: `
  473. <el-form :model="form" :rules="rules" ref="form">
  474. <el-form-item label="是否接受协议" prop="accept" ref="field">
  475. <el-checkbox v-model="form.accept">
  476. <span>接受协议</span>
  477. </el-checkbox>
  478. </el-form-item>
  479. </el-form>
  480. `,
  481. data() {
  482. return {
  483. form: {
  484. accept: true
  485. },
  486. rules: {
  487. accept: [
  488. {
  489. validator: (rule, value, callback) => {
  490. value ? callback() : callback(new Error('您需要接受用户协议'));
  491. },
  492. trigger: 'change'
  493. }
  494. ]
  495. }
  496. };
  497. },
  498. methods: {
  499. setValue(value) {
  500. this.form.accept = value;
  501. }
  502. }
  503. }, true);
  504. vm.form.accept = false;
  505. vm.$nextTick(_ => {
  506. expect(vm.$refs.field.validateMessage).to.equal('您需要接受用户协议');
  507. });
  508. vm.$refs.form.validate(valid => {
  509. let field = vm.$refs.field;
  510. expect(valid).to.not.true;
  511. expect(field.validateMessage).to.equal('您需要接受用户协议');
  512. vm.$refs.form.$nextTick(_ => {
  513. vm.setValue(true);
  514. vm.$refs.form.$nextTick(_ => {
  515. expect(field.validateMessage).to.equal('');
  516. done();
  517. });
  518. });
  519. });
  520. });
  521. it('checkbox group', done => {
  522. vm = createVue({
  523. template: `
  524. <el-form :model="form" :rules="rules" ref="form">
  525. <el-form-item label="活动名称" prop="type" ref="field">
  526. <el-checkbox-group v-model="form.type">
  527. <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
  528. <el-checkbox label="地推活动" name="type"></el-checkbox>
  529. <el-checkbox label="线下主题活动" name="type"></el-checkbox>
  530. <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
  531. </el-checkbox-group>
  532. </el-form-item>
  533. </el-form>
  534. `,
  535. data() {
  536. return {
  537. form: {
  538. type: []
  539. },
  540. rules: {
  541. type: [
  542. { type: 'array', required: true, message: '请选择活动类型', trigger: 'change' }
  543. ]
  544. }
  545. };
  546. },
  547. methods: {
  548. setValue(value) {
  549. this.form.type = value;
  550. }
  551. }
  552. }, true);
  553. vm.$refs.form.validate(valid => {
  554. let field = vm.$refs.field;
  555. expect(valid).to.not.true;
  556. vm.$refs.form.$nextTick(_ => {
  557. expect(field.validateMessage).to.equal('请选择活动类型');
  558. vm.setValue(['地推活动']);
  559. vm.$refs.form.$nextTick(_ => {
  560. expect(field.validateMessage).to.equal('');
  561. done();
  562. });
  563. });
  564. });
  565. });
  566. it('radio group', done => {
  567. vm = createVue({
  568. template: `
  569. <el-form :model="form" :rules="rules" ref="form">
  570. <el-form-item label="活动名称" prop="type" ref="field">
  571. <el-radio-group v-model="form.type">
  572. <el-radio label="线上品牌商赞助"></el-radio>
  573. <el-radio label="线下场地免费"></el-radio>
  574. </el-radio-group>
  575. </el-form-item>
  576. </el-form>
  577. `,
  578. data() {
  579. return {
  580. form: {
  581. type: ''
  582. },
  583. rules: {
  584. type: [
  585. { required: true, message: '请选择活动类型', trigger: 'change' }
  586. ]
  587. }
  588. };
  589. },
  590. methods: {
  591. setValue(value) {
  592. this.form.type = value;
  593. }
  594. }
  595. }, true);
  596. vm.$refs.form.validate(valid => {
  597. let field = vm.$refs.field;
  598. expect(valid).to.not.true;
  599. vm.$refs.form.$nextTick(_ => {
  600. expect(field.validateMessage).to.equal('请选择活动类型');
  601. vm.setValue('线下场地免费');
  602. vm.$refs.form.$nextTick(_ => {
  603. expect(field.validateMessage).to.equal('');
  604. done();
  605. });
  606. });
  607. });
  608. });
  609. it('validate field', done => {
  610. vm = createVue({
  611. template: `
  612. <el-form :model="form" :rules="rules" ref="form">
  613. <el-form-item label="活动名称" prop="name" ref="field">
  614. <el-input v-model="form.name"></el-input>
  615. </el-form-item>
  616. </el-form>
  617. `,
  618. data() {
  619. return {
  620. form: {
  621. name: ''
  622. },
  623. rules: {
  624. name: [
  625. { required: true, message: '请输入活动名称', trigger: 'change', min: 3, max: 6 }
  626. ]
  627. }
  628. };
  629. },
  630. methods: {
  631. setValue(value) {
  632. this.form.name = value;
  633. }
  634. }
  635. }, true);
  636. vm.$refs.form.validateField('name', valid => {
  637. expect(valid).to.not.true;
  638. done();
  639. });
  640. });
  641. it('custom validate', done => {
  642. var checkName = (rule, value, callback) => {
  643. if (value.length < 5) {
  644. callback(new Error('长度至少为5'));
  645. } else {
  646. callback();
  647. }
  648. };
  649. vm = createVue({
  650. template: `
  651. <el-form :model="form" :rules="rules" ref="form">
  652. <el-form-item label="活动名称" prop="name" ref="field">
  653. <el-input v-model="form.name"></el-input>
  654. </el-form-item>
  655. </el-form>
  656. `,
  657. data() {
  658. return {
  659. form: {
  660. name: ''
  661. },
  662. rules: {
  663. name: [
  664. { validator: checkName, trigger: 'change' }
  665. ]
  666. }
  667. };
  668. },
  669. methods: {
  670. setValue(value) {
  671. this.form.name = value;
  672. }
  673. }
  674. }, true);
  675. vm.$refs.form.validate(valid => {
  676. let field = vm.$refs.field;
  677. expect(valid).to.not.true;
  678. vm.$refs.form.$nextTick(_ => {
  679. expect(field.validateMessage).to.equal('长度至少为5');
  680. vm.setValue('aaaaaa');
  681. vm.$refs.form.$nextTick(_ => {
  682. expect(field.validateMessage).to.equal('');
  683. done();
  684. });
  685. });
  686. });
  687. });
  688. it('error', done => {
  689. vm = createVue({
  690. template: `
  691. <el-form :model="form" :rules="rules" ref="form">
  692. <el-form-item label="活动名称" prop="name" :error="error" ref="field">
  693. <el-input v-model="form.name"></el-input>
  694. </el-form-item>
  695. </el-form>
  696. `,
  697. data() {
  698. return {
  699. error: 'dsad',
  700. form: {
  701. name: 'sada'
  702. },
  703. rules: {
  704. name: [
  705. { required: true, message: '请输入活动名称', trigger: 'change', min: 3, max: 6 }
  706. ]
  707. }
  708. };
  709. },
  710. methods: {
  711. setValue(value) {
  712. this.form.name = value;
  713. }
  714. }
  715. }, true);
  716. vm.$refs.form.validate(valid => {
  717. let field = vm.$refs.field;
  718. expect(valid).to.true;
  719. vm.error = '输入不合法';
  720. vm.$refs.field.$nextTick(_ => {
  721. expect(field.validateState).to.equal('error');
  722. expect(field.validateMessage).to.equal('输入不合法');
  723. done();
  724. });
  725. });
  726. });
  727. it('invalid fields', done => {
  728. var checkName = (rule, value, callback) => {
  729. if (value.length < 5) {
  730. callback(new Error('长度至少为5'));
  731. } else {
  732. callback();
  733. }
  734. };
  735. vm = createVue({
  736. template: `
  737. <el-form :model="form" :rules="rules" ref="form">
  738. <el-form-item label="活动名称" prop="name" ref="field">
  739. <el-input v-model="form.name"></el-input>
  740. </el-form-item>
  741. </el-form>
  742. `,
  743. data() {
  744. return {
  745. form: {
  746. name: ''
  747. },
  748. rules: {
  749. name: [
  750. { validator: checkName, trigger: 'change' }
  751. ]
  752. }
  753. };
  754. }
  755. }, true);
  756. vm.$refs.form.validate((valid, invalidFields) => {
  757. expect(invalidFields.name.length).to.equal(1);
  758. done();
  759. });
  760. });
  761. it('validate return promise', done => {
  762. var checkName = (rule, value, callback) => {
  763. if (value.length < 5) {
  764. callback(new Error('长度至少为5'));
  765. } else {
  766. callback();
  767. }
  768. };
  769. vm = createVue({
  770. template: `
  771. <el-form :model="form" :rules="rules" ref="form">
  772. <el-form-item label="活动名称" prop="name" ref="field">
  773. <el-input v-model="form.name"></el-input>
  774. </el-form-item>
  775. </el-form>
  776. `,
  777. data() {
  778. return {
  779. form: {
  780. name: ''
  781. },
  782. rules: {
  783. name: [
  784. { validator: checkName, trigger: 'change' }
  785. ]
  786. }
  787. };
  788. }
  789. }, true);
  790. vm.$refs.form.validate().catch(validFailed => {
  791. expect(validFailed).to.false;
  792. done();
  793. });
  794. });
  795. });
  796. it('validate event', done => {
  797. vm = createVue({
  798. template: `
  799. <el-form :model="form" :rules="rules" ref="form" @validate="onValidate">
  800. <el-form-item label="活动名称" prop="name" ref="name">
  801. <el-input v-model="form.name"></el-input>
  802. </el-form-item>
  803. <el-form-item label="活动地点" prop="addr" ref="addr">
  804. <el-input v-model="form.addr"></el-input>
  805. </el-form-item>
  806. </el-form>
  807. `,
  808. data() {
  809. return {
  810. form: {
  811. name: '',
  812. addr: ''
  813. },
  814. valid: {
  815. name: null,
  816. addr: null
  817. },
  818. rules: {
  819. name: [
  820. { required: true, message: '请输入活动名称', trigger: 'change', min: 3, max: 6 }
  821. ],
  822. addr: [
  823. { required: true, message: '请输入活动名称', trigger: 'change' }
  824. ]
  825. }
  826. };
  827. },
  828. methods: {
  829. onValidate(prop, valid) {
  830. this.valid[prop] = valid;
  831. },
  832. setValue(prop, value) {
  833. this.form[prop] = value;
  834. }
  835. }
  836. }, true);
  837. vm.setValue('name', '1');
  838. setTimeout(() => {
  839. expect(vm.valid.name).to.equal(false);
  840. vm.setValue('addr', '1');
  841. setTimeout(() => {
  842. expect(vm.valid.addr).to.equal(true);
  843. vm.setValue('name', '111');
  844. setTimeout(() => {
  845. expect(vm.valid.name).to.equal(true);
  846. done();
  847. }, DELAY);
  848. }, DELAY);
  849. }, DELAY);
  850. });
  851. });