]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
test(runtime-core): test effectscope instance null (#8397)
authorLinghao Su <slh001@live.cn>
Tue, 16 Jul 2024 03:40:53 +0000 (11:40 +0800)
committerGitHub <noreply@github.com>
Tue, 16 Jul 2024 03:40:53 +0000 (11:40 +0800)
packages/runtime-core/__tests__/apiWatch.spec.ts

index febfd462d06140b7be512235895e2f378e36e768..82630c46377713c35b5aa3c6b56a2d904f11dcde 100644 (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()
+  })
 })