Skip to content

Commit 260d464

Browse files
authored
feat(tests): improve async handling in tests (#1049)
- Use waitFor to handle async operations - Update triggerFormButton to be async - Log invalid fields on form submission error
1 parent d540ee5 commit 260d464

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

frontend/src/components/__tests__/organizations/NewOrganization.spec.js

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { describe, it, expect, vi } from 'vitest'
22
import { mount } from '@vue/test-utils'
33
import NewOrganization from '@/components/organizations/NewOrganization.vue'
4+
import waitFor from 'wait-for-expect'
45

56
const createWrapper = (props) => {
67
return mount(NewOrganization, {
@@ -15,13 +16,12 @@ const createWrapper = (props) => {
1516
})
1617
}
1718

18-
const triggerFormButton = (wrapper) => {
19+
const triggerFormButton = async (wrapper) => {
1920
const button = wrapper.findComponent({ name: 'CsgButton' })
20-
button.trigger('click')
21-
// here in the true component button click will trigger an async request and will take some time
22-
// but the test code will not wait for the async function end and will go to next step to do the check
23-
// if we do not wait some time here, the test will failed
24-
return new Promise((resolve) => { setTimeout(resolve, 1000) })
21+
await button.trigger('click')
22+
23+
// deprecate this, as we can use waitFor to wait for the async operation to complete
24+
// return new Promise((resolve) => { setTimeout(resolve, 2000) })
2525
}
2626

2727
vi.mock('../../../stores/UserStore', () => ({
@@ -55,8 +55,11 @@ describe('NewOrganization', () => {
5555
it('validates required fields', async () => {
5656
const wrapper = createWrapper()
5757
await triggerFormButton(wrapper)
58-
const formErrors = wrapper.findAll('.el-form-item__error')
59-
expect(formErrors.length).toBeGreaterThan(0)
58+
59+
await waitFor(() => {
60+
const formErrors = wrapper.findAll('.el-form-item__error')
61+
expect(formErrors.length).toBeGreaterThan(0)
62+
})
6063
})
6164
})
6265

@@ -71,9 +74,13 @@ describe('NewOrganization', () => {
7174
nickname: 'valid-org',
7275
org_type: '企业',
7376
}
77+
// after reactive attr chnage, better to wait for next tick to maker sure the change apply to Dom
7478
await wrapper.vm.$nextTick()
7579
await triggerFormButton(wrapper)
76-
expect(window.location.href).toBe('/organizations/testorg')
80+
81+
await waitFor(() => {
82+
expect(window.location.href).toBe('/organizations/testorg')
83+
})
7784
})
7885
})
7986
})

frontend/src/components/organizations/NewOrganization.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,11 @@
173173
}
174174
},
175175
handleSubmit() {
176-
this.$refs['dataFormRef'].validate(async (valid) => {
176+
this.$refs['dataFormRef'].validate(async (valid, invalidFields) => {
177177
if (valid) {
178178
this.createOrganization()
179179
} else {
180+
console.log('error submit!!', invalidFields)
180181
return false
181182
}
182183
})

0 commit comments

Comments
 (0)