form.spec.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. import { createVue, destroyVM } from '../util';
  2. describe('Form', () => {
  3. let vm;
  4. afterEach(() => {
  5. destroyVM(vm);
  6. });
  7. it('label width', done => {
  8. vm = createVue({
  9. template: `
  10. <el-form ref="form" :model="form" label-width="80px">
  11. <el-form-item label="活动名称">
  12. <el-input v-model="form.name"></el-input>
  13. </el-form-item>
  14. </el-form>
  15. `,
  16. data() {
  17. return {
  18. form: {
  19. name: ''
  20. }
  21. };
  22. }
  23. }, true);
  24. expect(vm.$el.querySelector('.el-form-item__label').style.width).to.equal('80px');
  25. expect(vm.$el.querySelector('.el-form-item__content').style.marginLeft).to.equal('80px');
  26. done();
  27. });
  28. it('inline form', done => {
  29. vm = createVue({
  30. template: `
  31. <el-form ref="form" :model="form" inline>
  32. <el-form-item>
  33. <el-input v-model="form.name"></el-input>
  34. </el-form-item>
  35. <el-form-item>
  36. <el-input v-model="form.address"></el-input>
  37. </el-form-item>
  38. </el-form>
  39. `,
  40. data() {
  41. return {
  42. form: {
  43. name: '',
  44. address: ''
  45. }
  46. };
  47. }
  48. }, true);
  49. expect(vm.$el.classList.contains('el-form--inline')).to.be.true;
  50. done();
  51. });
  52. it('label position', done => {
  53. vm = createVue({
  54. template: `
  55. <div>
  56. <el-form :model="form" label-position="top" ref="labelTop">
  57. <el-form-item>
  58. <el-input v-model="form.name"></el-input>
  59. </el-form-item>
  60. <el-form-item>
  61. <el-input v-model="form.address"></el-input>
  62. </el-form-item>
  63. </el-form>
  64. <el-form :model="form" label-position="left" ref="labelLeft">
  65. <el-form-item>
  66. <el-input v-model="form.name"></el-input>
  67. </el-form-item>
  68. <el-form-item>
  69. <el-input v-model="form.address"></el-input>
  70. </el-form-item>
  71. </el-form>
  72. </div>
  73. `,
  74. data() {
  75. return {
  76. form: {
  77. name: '',
  78. address: ''
  79. }
  80. };
  81. }
  82. }, true);
  83. expect(vm.$refs.labelTop.$el.classList.contains('el-form--label-top')).to.be.true;
  84. expect(vm.$refs.labelLeft.$el.classList.contains('el-form--label-left')).to.be.true;
  85. done();
  86. });
  87. it('show message', done => {
  88. vm = createVue({
  89. template: `
  90. <el-form :model="form" ref="form">
  91. <el-form-item label="活动名称" prop="name" :show-message="false"
  92. :rules="{
  93. required: true,
  94. message: '请输入活动名称',
  95. trigger: 'change',
  96. min: 3,
  97. max: 6
  98. }"
  99. >
  100. <el-input v-model="form.name"></el-input>
  101. </el-form-item>
  102. </el-form>
  103. `,
  104. data() {
  105. return {
  106. form: {
  107. name: ''
  108. }
  109. };
  110. }
  111. }, true);
  112. vm.$refs.form.validate(valid => {
  113. expect(valid).to.not.true;
  114. vm.$refs.form.$nextTick(_ => {
  115. expect(vm.$el.querySelector('.el-form-item__error')).to.not.exist;
  116. done();
  117. });
  118. });
  119. });
  120. it('reset field', done => {
  121. vm = createVue({
  122. template: `
  123. <el-form ref="form" :model="form" :rules="rules">
  124. <el-form-item label="活动名称" prop="name">
  125. <el-input v-model="form.name" ref="fieldName"></el-input>
  126. </el-form-item>
  127. <el-form-item label="活动地址" prop="address">
  128. <el-input v-model="form.address" ref="fieldAddr"></el-input>
  129. </el-form-item>
  130. <el-form-item label="活动性质" prop="type">
  131. <el-checkbox-group v-model="form.type">
  132. <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
  133. <el-checkbox label="地推活动" name="type"></el-checkbox>
  134. <el-checkbox label="线下主题活动" name="type"></el-checkbox>
  135. <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
  136. </el-checkbox-group>
  137. </el-form-item>
  138. </el-form>
  139. `,
  140. data() {
  141. return {
  142. form: {
  143. name: '',
  144. address: '',
  145. type: []
  146. },
  147. rules: {
  148. name: [
  149. { required: true, message: '请输入活动名称', trigger: 'blur' }
  150. ],
  151. address: [
  152. { required: true, message: '请选择活动区域', trigger: 'change' }
  153. ],
  154. type: [
  155. { type: 'array', required: true, message: '请至少选择一个活动性质', trigger: 'change' }
  156. ]
  157. }
  158. };
  159. },
  160. methods: {
  161. setValue() {
  162. this.form.name = 'jack';
  163. this.form.address = 'aaaa';
  164. this.form.type.push('地推活动');
  165. }
  166. }
  167. }, true);
  168. vm.setValue();
  169. vm.$refs.form.resetFields();
  170. vm.$refs.form.$nextTick(_ => {
  171. expect(vm.form.name).to.equal('');
  172. expect(vm.form.address).to.equal('');
  173. expect(vm.form.type.length).to.equal(0);
  174. done();
  175. });
  176. });
  177. it('form item nest', done => {
  178. vm = createVue({
  179. template: `
  180. <el-form ref="form" :model="form" :rules="rules">
  181. <el-form-item label="活动时间" required>
  182. <el-col :span="11">
  183. <el-form-item prop="date1">
  184. <el-date-picker type="date" placeholder="选择日期" v-model="form.date1" style="width: 100%;"></el-date-picker>
  185. </el-form-item>
  186. </el-col>
  187. <el-col class="line" :span="2">-</el-col>
  188. <el-col :span="11">
  189. <el-form-item prop="date2">
  190. <el-time-picker type="fixed-time" placeholder="选择时间" v-model="form.date2" style="width: 100%;"></el-time-picker>
  191. </el-form-item>
  192. </el-col>
  193. </el-form-item>
  194. </el-form>
  195. `,
  196. data() {
  197. return {
  198. form: {
  199. date1: '',
  200. date2: ''
  201. },
  202. rules: {
  203. date1: [
  204. { type: 'date', required: true, message: '请选择日期', trigger: 'change' }
  205. ]
  206. }
  207. };
  208. },
  209. methods: {
  210. setValue() {
  211. this.name = 'jack';
  212. this.address = 'aaaa';
  213. }
  214. }
  215. }, true);
  216. vm.$refs.form.validate(valid => {
  217. expect(valid).to.not.true;
  218. done();
  219. });
  220. });
  221. describe('validate', () => {
  222. it('input', done => {
  223. vm = createVue({
  224. template: `
  225. <el-form :model="form" :rules="rules" ref="form">
  226. <el-form-item label="活动名称" prop="name" ref="field">
  227. <el-input v-model="form.name"></el-input>
  228. </el-form-item>
  229. </el-form>
  230. `,
  231. data() {
  232. return {
  233. form: {
  234. name: ''
  235. },
  236. rules: {
  237. name: [
  238. { required: true, message: '请输入活动名称', trigger: 'change', min: 3, max: 6 }
  239. ]
  240. }
  241. };
  242. },
  243. methods: {
  244. setValue(value) {
  245. this.form.name = value;
  246. }
  247. }
  248. }, true);
  249. vm.$refs.form.validate(valid => {
  250. let field = vm.$refs.field;
  251. expect(valid).to.not.true;
  252. vm.$refs.form.$nextTick(_ => {
  253. expect(field.validateMessage).to.equal('请输入活动名称');
  254. vm.setValue('aaaaa');
  255. vm.$refs.form.$nextTick(_ => {
  256. expect(field.validateMessage).to.equal('');
  257. vm.setValue('aa');
  258. vm.$refs.form.$nextTick(_ => {
  259. expect(field.validateMessage).to.equal('请输入活动名称');
  260. done();
  261. });
  262. });
  263. });
  264. });
  265. });
  266. it('textarea', done => {
  267. vm = createVue({
  268. template: `
  269. <el-form :model="form" :rules="rules" ref="form">
  270. <el-form-item label="活动名称" prop="name" ref="field">
  271. <el-input type="textarea" v-model="form.name"></el-input>
  272. </el-form-item>
  273. </el-form>
  274. `,
  275. data() {
  276. return {
  277. form: {
  278. name: ''
  279. },
  280. rules: {
  281. name: [
  282. { required: true, message: '请输入活动名称', trigger: 'change', min: 3, max: 6 }
  283. ]
  284. }
  285. };
  286. },
  287. methods: {
  288. setValue(value) {
  289. this.form.name = value;
  290. }
  291. }
  292. }, true);
  293. vm.$refs.form.validate(valid => {
  294. let field = vm.$refs.field;
  295. expect(valid).to.not.true;
  296. vm.$refs.form.$nextTick(_ => {
  297. expect(field.validateMessage).to.equal('请输入活动名称');
  298. vm.setValue('aaaaa');
  299. vm.$refs.form.$nextTick(_ => {
  300. expect(field.validateMessage).to.equal('');
  301. vm.setValue('aa');
  302. vm.$refs.form.$nextTick(_ => {
  303. expect(field.validateMessage).to.equal('请输入活动名称');
  304. done();
  305. });
  306. });
  307. });
  308. });
  309. });
  310. it('selector', done => {
  311. vm = createVue({
  312. template: `
  313. <el-form :model="form" :rules="rules" ref="form">
  314. <el-form-item label="记住密码" prop="region" ref="field">
  315. <el-select v-model="form.region" placeholder="请选择活动区域">
  316. <el-option label="区域一" value="shanghai"></el-option>
  317. <el-option label="区域二" value="beijing"></el-option>
  318. </el-select>
  319. </el-form-item>
  320. </el-form>
  321. `,
  322. data() {
  323. return {
  324. form: {
  325. region: 'shanghai'
  326. },
  327. rules: {
  328. region: [
  329. {required: true, message: '请选择活动区域', trigger: 'change' }
  330. ]
  331. }
  332. };
  333. },
  334. methods: {
  335. setValue(value) {
  336. this.form.region = value;
  337. }
  338. }
  339. }, true);
  340. vm.$refs.form.validate(valid => {
  341. let field = vm.$refs.field;
  342. expect(valid).to.true;
  343. vm.setValue('');
  344. setTimeout(_ => {
  345. expect(field.validateMessage).to.equal('请选择活动区域');
  346. vm.setValue('shanghai');
  347. setTimeout(_ => {
  348. expect(field.validateMessage).to.equal('');
  349. done();
  350. }, 100);
  351. }, 100);
  352. });
  353. });
  354. it('datepicker', done => {
  355. vm = createVue({
  356. template: `
  357. <el-form :model="form" :rules="rules" ref="form">
  358. <el-form-item label="记住密码" prop="date" ref="field">
  359. <el-date-picker type="date" placeholder="选择日期" v-model="form.date" style="width: 100%;"></el-date-picker>
  360. </el-form-item>
  361. </el-form>
  362. `,
  363. data() {
  364. return {
  365. form: {
  366. date: ''
  367. },
  368. rules: {
  369. date: [
  370. {type: 'date', required: true, message: '请选择日期', trigger: 'change' }
  371. ]
  372. }
  373. };
  374. },
  375. methods: {
  376. setValue(value) {
  377. this.form.date = value;
  378. }
  379. }
  380. }, true);
  381. vm.$refs.form.validate(valid => {
  382. let field = vm.$refs.field;
  383. expect(valid).to.not.true;
  384. vm.$refs.form.$nextTick(_ => {
  385. expect(field.validateMessage).to.equal('请选择日期');
  386. vm.setValue(new Date());
  387. vm.$refs.form.$nextTick(_ => {
  388. expect(field.validateMessage).to.equal('');
  389. done();
  390. });
  391. });
  392. });
  393. });
  394. it('timepicker', done => {
  395. vm = createVue({
  396. template: `
  397. <el-form :model="form" :rules="rules" ref="form">
  398. <el-form-item label="记住密码" prop="date" ref="field">
  399. <el-time-picker type="fixed-time" placeholder="选择时间" v-model="form.date" style="width: 100%;"></el-time-picker>
  400. </el-form-item>
  401. </el-form>
  402. `,
  403. data() {
  404. return {
  405. form: {
  406. date: ''
  407. },
  408. rules: {
  409. date: [
  410. {type: 'date', required: true, message: '请选择时间', trigger: 'change' }
  411. ]
  412. }
  413. };
  414. },
  415. methods: {
  416. setValue(value) {
  417. this.form.date = value;
  418. }
  419. }
  420. }, true);
  421. vm.$refs.form.validate(valid => {
  422. let field = vm.$refs.field;
  423. expect(valid).to.not.true;
  424. vm.$refs.form.$nextTick(_ => {
  425. expect(field.validateMessage).to.equal('请选择时间');
  426. vm.setValue(new Date());
  427. vm.$refs.form.$nextTick(_ => {
  428. expect(field.validateMessage).to.equal('');
  429. done();
  430. });
  431. });
  432. });
  433. });
  434. it('checkbox group', done => {
  435. vm = createVue({
  436. template: `
  437. <el-form :model="form" :rules="rules" ref="form">
  438. <el-form-item label="活动名称" prop="type" ref="field">
  439. <el-checkbox-group v-model="form.type">
  440. <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
  441. <el-checkbox label="地推活动" name="type"></el-checkbox>
  442. <el-checkbox label="线下主题活动" name="type"></el-checkbox>
  443. <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
  444. </el-checkbox-group>
  445. </el-form-item>
  446. </el-form>
  447. `,
  448. data() {
  449. return {
  450. form: {
  451. type: []
  452. },
  453. rules: {
  454. type: [
  455. { type: 'array', required: true, message: '请选择活动类型', trigger: 'change' }
  456. ]
  457. }
  458. };
  459. },
  460. methods: {
  461. setValue(value) {
  462. this.form.type = value;
  463. }
  464. }
  465. }, true);
  466. vm.$refs.form.validate(valid => {
  467. let field = vm.$refs.field;
  468. expect(valid).to.not.true;
  469. vm.$refs.form.$nextTick(_ => {
  470. expect(field.validateMessage).to.equal('请选择活动类型');
  471. vm.setValue(['地推活动']);
  472. vm.$refs.form.$nextTick(_ => {
  473. expect(field.validateMessage).to.equal('');
  474. done();
  475. });
  476. });
  477. });
  478. });
  479. it('radio group', done => {
  480. vm = createVue({
  481. template: `
  482. <el-form :model="form" :rules="rules" ref="form">
  483. <el-form-item label="活动名称" prop="type" ref="field">
  484. <el-radio-group v-model="form.type">
  485. <el-radio label="线上品牌商赞助"></el-radio>
  486. <el-radio label="线下场地免费"></el-radio>
  487. </el-radio-group>
  488. </el-form-item>
  489. </el-form>
  490. `,
  491. data() {
  492. return {
  493. form: {
  494. type: ''
  495. },
  496. rules: {
  497. type: [
  498. { required: true, message: '请选择活动类型', trigger: 'change' }
  499. ]
  500. }
  501. };
  502. },
  503. methods: {
  504. setValue(value) {
  505. this.form.type = value;
  506. }
  507. }
  508. }, true);
  509. vm.$refs.form.validate(valid => {
  510. let field = vm.$refs.field;
  511. expect(valid).to.not.true;
  512. vm.$refs.form.$nextTick(_ => {
  513. expect(field.validateMessage).to.equal('请选择活动类型');
  514. vm.setValue('线下场地免费');
  515. vm.$refs.form.$nextTick(_ => {
  516. expect(field.validateMessage).to.equal('');
  517. done();
  518. });
  519. });
  520. });
  521. });
  522. it('validate field', done => {
  523. vm = createVue({
  524. template: `
  525. <el-form :model="form" :rules="rules" ref="form">
  526. <el-form-item label="活动名称" prop="name" ref="field">
  527. <el-input v-model="form.name"></el-input>
  528. </el-form-item>
  529. </el-form>
  530. `,
  531. data() {
  532. return {
  533. form: {
  534. name: ''
  535. },
  536. rules: {
  537. name: [
  538. { required: true, message: '请输入活动名称', trigger: 'change', min: 3, max: 6 }
  539. ]
  540. }
  541. };
  542. },
  543. methods: {
  544. setValue(value) {
  545. this.form.name = value;
  546. }
  547. }
  548. }, true);
  549. vm.$refs.form.validateField('name', valid => {
  550. expect(valid).to.not.true;
  551. done();
  552. });
  553. });
  554. it('custom validate', done => {
  555. var checkName = (rule, value, callback) => {
  556. if (value.length < 5) {
  557. callback(new Error('长度至少为5'));
  558. } else {
  559. callback();
  560. }
  561. };
  562. vm = createVue({
  563. template: `
  564. <el-form :model="form" :rules="rules" ref="form">
  565. <el-form-item label="活动名称" prop="name" ref="field">
  566. <el-input v-model="form.name"></el-input>
  567. </el-form-item>
  568. </el-form>
  569. `,
  570. data() {
  571. return {
  572. form: {
  573. name: ''
  574. },
  575. rules: {
  576. name: [
  577. { validator: checkName, trigger: 'change' }
  578. ]
  579. }
  580. };
  581. },
  582. methods: {
  583. setValue(value) {
  584. this.form.name = value;
  585. }
  586. }
  587. }, true);
  588. vm.$refs.form.validate(valid => {
  589. let field = vm.$refs.field;
  590. expect(valid).to.not.true;
  591. vm.$refs.form.$nextTick(_ => {
  592. expect(field.validateMessage).to.equal('长度至少为5');
  593. vm.setValue('aaaaaa');
  594. vm.$refs.form.$nextTick(_ => {
  595. expect(field.validateMessage).to.equal('');
  596. done();
  597. });
  598. });
  599. });
  600. });
  601. it('error', done => {
  602. vm = createVue({
  603. template: `
  604. <el-form :model="form" :rules="rules" ref="form">
  605. <el-form-item label="活动名称" prop="name" :error="error" ref="field">
  606. <el-input v-model="form.name"></el-input>
  607. </el-form-item>
  608. </el-form>
  609. `,
  610. data() {
  611. return {
  612. error: 'dsad',
  613. form: {
  614. name: 'sada'
  615. },
  616. rules: {
  617. name: [
  618. { required: true, message: '请输入活动名称', trigger: 'change', min: 3, max: 6 }
  619. ]
  620. }
  621. };
  622. },
  623. methods: {
  624. setValue(value) {
  625. this.form.name = value;
  626. }
  627. }
  628. }, true);
  629. vm.$refs.form.validate(valid => {
  630. let field = vm.$refs.field;
  631. expect(valid).to.true;
  632. vm.error = '输入不合法';
  633. vm.$refs.field.$nextTick(_ => {
  634. expect(field.validateState).to.equal('error');
  635. expect(field.validateMessage).to.equal('输入不合法');
  636. done();
  637. });
  638. });
  639. });
  640. });
  641. });