form.spec.js 17 KB

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