diff --git a/packages/vant/src/form/test/__snapshots__/events.legacy.js.snap b/packages/vant/src/form/test/__snapshots__/events.legacy.js.snap
deleted file mode 100644
index a20948ddc..000000000
--- a/packages/vant/src/form/test/__snapshots__/events.legacy.js.snap
+++ /dev/null
@@ -1,20 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`failed event 1`] = `
-
-`;
diff --git a/packages/vant/src/form/test/__snapshots__/events.spec.tsx.snap b/packages/vant/src/form/test/__snapshots__/events.spec.tsx.snap
new file mode 100644
index 000000000..b9aed125a
--- /dev/null
+++ b/packages/vant/src/form/test/__snapshots__/events.spec.tsx.snap
@@ -0,0 +1,32 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`should emit failed event when validating failed 1`] = `
+
+`;
diff --git a/packages/vant/src/form/test/events.legacy.js b/packages/vant/src/form/test/events.legacy.js
deleted file mode 100644
index e9af2642a..000000000
--- a/packages/vant/src/form/test/events.legacy.js
+++ /dev/null
@@ -1,67 +0,0 @@
-import { mountForm, submitForm, mountSimpleRulesForm } from './shared';
-
-test('submit event', async () => {
- const onSubmit = jest.fn();
- const wrapper = mountForm({
- template: `
-
-
-
-
- `,
- methods: {
- onSubmit,
- },
- });
-
- await submitForm(wrapper);
-
- expect(onSubmit).toHaveBeenCalledWith({ A: 'bar' });
-});
-
-test('failed event', async () => {
- const onFailed = jest.fn();
- const wrapper = mountSimpleRulesForm({
- methods: {
- onFailed,
- },
- });
-
- await submitForm(wrapper);
-
- expect(wrapper.html()).toMatchSnapshot();
- expect(onFailed).toHaveBeenCalledWith({
- errors: [
- { name: 'A', message: 'A failed' },
- { name: 'B', message: 'B failed' },
- ],
- values: { A: '', B: '' },
- });
-});
-
-test('failed event when rule message is empty', async () => {
- const onFailed = jest.fn();
- const wrapper = mountForm({
- template: `
-
-
-
-
- `,
- data() {
- return {
- rulesA: [{ required: true }],
- };
- },
- methods: {
- onFailed,
- },
- });
-
- await submitForm(wrapper);
-
- expect(onFailed).toHaveBeenCalledWith({
- errors: [{ name: 'A' }],
- values: { A: '' },
- });
-});
diff --git a/packages/vant/src/form/test/events.spec.tsx b/packages/vant/src/form/test/events.spec.tsx
new file mode 100644
index 000000000..97c29b8d3
--- /dev/null
+++ b/packages/vant/src/form/test/events.spec.tsx
@@ -0,0 +1,66 @@
+import { mount } from '../../../test';
+import { submitForm, mountSimpleRulesForm } from './shared';
+import { Form } from '..';
+import { Field } from '../../field';
+
+test('should emit submit event when submitting form', async () => {
+ const onSubmit = jest.fn();
+ const wrapper = mount({
+ render() {
+ return (
+
+ );
+ },
+ });
+
+ await submitForm(wrapper);
+
+ expect(onSubmit).toHaveBeenCalledWith({ A: 'bar' });
+});
+
+test('should emit failed event when validating failed', async () => {
+ const onFailed = jest.fn();
+ const wrapper = mountSimpleRulesForm({
+ methods: {
+ onFailed,
+ },
+ });
+
+ await submitForm(wrapper);
+
+ expect(wrapper.html()).toMatchSnapshot();
+ expect(onFailed).toHaveBeenCalledWith({
+ errors: [
+ { name: 'A', message: 'A failed' },
+ { name: 'B', message: 'B failed' },
+ ],
+ values: { A: '', B: '' },
+ });
+});
+
+test('should emit failed event correctly when rule message is empty', async () => {
+ const onFailed = jest.fn();
+ const wrapper = mount({
+ render() {
+ return (
+
+ );
+ },
+ data() {
+ return {
+ rulesA: [{ required: true }],
+ };
+ },
+ });
+
+ await submitForm(wrapper);
+
+ expect(onFailed).toHaveBeenCalledWith({
+ errors: [{ name: 'A', message: '' }],
+ values: { A: '' },
+ });
+});
diff --git a/packages/vant/src/form/test/index.legacy.js b/packages/vant/src/form/test/index.legacy.js
deleted file mode 100644
index 4e97428d7..000000000
--- a/packages/vant/src/form/test/index.legacy.js
+++ /dev/null
@@ -1,75 +0,0 @@
-import { mountForm, submitForm } from './shared';
-
-test('dynamic add/remove fileds', async () => {
- const onSubmit = jest.fn();
- const wrapper = mountForm({
- template: `
-
-
-
-
- `,
- data() {
- return { list: ['A'] };
- },
- methods: {
- onSubmit,
- },
- });
-
- await submitForm(wrapper);
- expect(onSubmit).toHaveBeenCalledWith({ A: '' });
-
- wrapper.setData({ list: ['A', 'B'] });
-
- await submitForm(wrapper);
- expect(onSubmit).toHaveBeenCalledWith({ A: '', B: '' });
-
- wrapper.setData({ list: ['B'] });
-
- await submitForm(wrapper);
- expect(onSubmit).toHaveBeenCalledWith({ B: '' });
-});
-
-test('dynamic add fileds when validate-first', async () => {
- const onFailed = jest.fn();
- const wrapper = mountForm({
- template: `
-
-
-
-
-
- `,
- data() {
- return {
- show: false,
- };
- },
- methods: {
- onFailed,
- },
- });
-
- await submitForm(wrapper);
- expect(onFailed.mock.calls[0][0].errors[0].name).toEqual('B');
-
- wrapper.setData({ show: true });
-
- await submitForm(wrapper);
- expect(onFailed.mock.calls[1][0].errors[0].name).toEqual('A');
-});
diff --git a/packages/vant/src/form/test/index.spec.tsx b/packages/vant/src/form/test/index.spec.tsx
index 36dcca3be..848379dfc 100644
--- a/packages/vant/src/form/test/index.spec.tsx
+++ b/packages/vant/src/form/test/index.spec.tsx
@@ -1,11 +1,11 @@
import { Form } from '..';
import { Field } from '../../field';
-import { mountForm } from './shared';
-import { later } from '../../../test';
+import { later, mount } from '../../../test';
+import { submitForm } from './shared';
test('should not reset validation after blurred when validate-trigger is onChange', async () => {
const validator = (val: string) => val.length > 4;
- const wrapper = mountForm({
+ const wrapper = mount({
data() {
return {
value: '',
@@ -34,3 +34,68 @@ test('should not reset validation after blurred when validate-trigger is onChang
await input.trigger('blur');
expect(wrapper.find('.van-field__error-message').exists()).toBeTruthy();
});
+
+test('should render correctly when dynamically add/remove fields', async () => {
+ const onSubmit = jest.fn();
+ const wrapper = mount({
+ render() {
+ return (
+
+ );
+ },
+ data() {
+ return { list: ['A'] };
+ },
+ });
+
+ await submitForm(wrapper);
+ expect(onSubmit).toHaveBeenCalledWith({ A: '' });
+
+ await wrapper.setData({ list: ['A', 'B'] });
+ await submitForm(wrapper);
+ expect(onSubmit).toHaveBeenCalledWith({ A: '', B: '' });
+
+ await wrapper.setData({ list: ['B'] });
+ await submitForm(wrapper);
+ expect(onSubmit).toHaveBeenCalledWith({ B: '' });
+});
+
+test('should validate first correctly when dynamically add field', async () => {
+ const onFailed = jest.fn();
+ const wrapper = mount({
+ render() {
+ return (
+
+ );
+ },
+ data() {
+ return {
+ show: false,
+ };
+ },
+ });
+
+ await submitForm(wrapper);
+ expect(onFailed.mock.calls[0][0].errors[0].name).toEqual('B');
+
+ await wrapper.setData({ show: true });
+ await submitForm(wrapper);
+ expect(onFailed.mock.calls[1][0].errors[0].name).toEqual('A');
+});
diff --git a/packages/vant/src/form/test/shared.js b/packages/vant/src/form/test/shared.js
deleted file mode 100644
index 4fbff62b6..000000000
--- a/packages/vant/src/form/test/shared.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import { mount, later } from '../../../test';
-
-export async function submitForm(wrapper) {
- wrapper.find('.van-button').trigger('click');
- return later();
-}
-
-export function mountForm(options) {
- return mount(options, { attachToDocument: true });
-}
-
-export function getSimpleRules() {
- return {
- rulesA: [{ required: true, message: 'A failed' }],
- rulesB: [{ required: true, message: 'B failed' }],
- };
-}
-
-export function mountSimpleRulesForm(options) {
- return mountForm({
- template: `
-
-
-
-
-
- `,
- data: getSimpleRules,
- ...options,
- });
-}
diff --git a/packages/vant/src/form/test/shared.tsx b/packages/vant/src/form/test/shared.tsx
new file mode 100644
index 000000000..f66cfabc8
--- /dev/null
+++ b/packages/vant/src/form/test/shared.tsx
@@ -0,0 +1,31 @@
+import { mount, later } from '../../../test';
+import { Form } from '..';
+import { Field } from '../../field';
+import type { VueWrapper } from '@vue/test-utils';
+
+export async function submitForm(wrapper: VueWrapper) {
+ await wrapper.find('form').trigger('submit');
+ return later();
+}
+
+export function getSimpleRules() {
+ return {
+ rulesA: [{ required: true, message: 'A failed' }],
+ rulesB: [{ required: true, message: 'B failed' }],
+ };
+}
+
+export function mountSimpleRulesForm(options: any) {
+ return mount({
+ render() {
+ return (
+
+ );
+ },
+ data: getSimpleRules,
+ ...options,
+ });
+}