]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
test: add test case for proper effect teardown w/ withAsyncContext
authorEvan You <yyx990803@gmail.com>
Tue, 6 Jul 2021 15:39:27 +0000 (11:39 -0400)
committerEvan You <yyx990803@gmail.com>
Tue, 6 Jul 2021 15:39:27 +0000 (11:39 -0400)
packages/runtime-core/__tests__/apiSetupHelpers.spec.ts

index cf698d7b8779e0e49160c01a4838f05aae03e9b9..5244a9a87b8d523d6e63a083f1a02778a1506941 100644 (file)
@@ -9,7 +9,9 @@ import {
   render,
   serializeInner,
   SetupContext,
-  Suspense
+  Suspense,
+  computed,
+  ComputedRef
 } from '@vue/runtime-test'
 import {
   defineEmits,
@@ -253,5 +255,35 @@ describe('SFC <script setup> helpers', () => {
       await ready
       expect(getCurrentInstance()).toBeNull()
     })
+
+    test('should teardown in-scope effects', async () => {
+      let resolve: (val?: any) => void
+      const ready = new Promise(r => {
+        resolve = r
+      })
+
+      let c: ComputedRef
+
+      const Comp = defineComponent({
+        async setup() {
+          await withAsyncContext(Promise.resolve())
+
+          c = computed(() => {})
+          // register the lifecycle after an await statement
+          onMounted(resolve)
+          return () => ''
+        }
+      })
+
+      const app = createApp(() => h(Suspense, () => h(Comp)))
+      const root = nodeOps.createElement('div')
+      app.mount(root)
+
+      await ready
+      expect(c!.effect.active).toBe(true)
+
+      app.unmount()
+      expect(c!.effect.active).toBe(false)
+    })
   })
 })