form.spec.js 17 KB

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