form.spec.js 26 KB

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