form.spec.js 29 KB

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