test(runtime-core): test effectscope instance null (#8397)

This commit is contained in:
Linghao Su 2024-07-16 11:40:53 +08:00 committed by GitHub
parent c0b9bd125c
commit 2d854414fa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 57 additions and 0 deletions

View File

@ -5,6 +5,7 @@ import {
defineComponent,
getCurrentInstance,
nextTick,
onErrorCaptured,
reactive,
ref,
watch,
@ -1576,4 +1577,60 @@ describe('api: watch', () => {
expect(spy).toHaveBeenCalledTimes(1)
expect(foo.value.a).toBe(2)
})
test('watch immediate error in effect scope should be catched by onErrorCaptured', async () => {
const warn = vi.spyOn(console, 'warn')
warn.mockImplementation(() => {})
const ERROR_IN_SCOPE = 'ERROR_IN_SCOPE'
const ERROR_OUT_SCOPE = 'ERROR_OUT_SCOPE'
const errors = ref<string[]>([])
const Comp = {
setup() {
const trigger = ref(0)
effectScope(true).run(() => {
watch(
trigger,
() => {
throw new Error(ERROR_IN_SCOPE)
},
{ immediate: true },
)
})
watchEffect(() => {
throw new Error(ERROR_OUT_SCOPE)
})
return () => ''
},
}
const root = nodeOps.createElement('div')
render(
h(
{
setup(_, { slots }) {
onErrorCaptured(e => {
errors.value.push(e.message)
return false
})
return () => h('div', slots.default && slots.default())
},
},
null,
() => [h(Comp)],
),
root,
)
await nextTick()
// only watchEffect as ran so far
expect(errors.value).toHaveLength(2)
expect(errors.value[0]).toBe(ERROR_IN_SCOPE)
expect(errors.value[1]).toBe(ERROR_OUT_SCOPE)
warn.mockRestore()
})
})