form.spec.js 28 KB

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