Skip to content

Commit bf329cb

Browse files
authored
test: add failing test cases for onScopeDispose inside watchers
1 parent 22dcbf3 commit bf329cb

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

packages/reactivity/__tests__/watch.spec.ts

+21
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
type WatchOptions,
66
type WatchScheduler,
77
computed,
8+
onScopeDispose,
89
onWatcherCleanup,
910
ref,
1011
watch,
@@ -277,4 +278,24 @@ describe('watch', () => {
277278

278279
expect(dummy).toEqual([1, 2, 3])
279280
})
281+
282+
// #12681
283+
test('onScopeDispose inside non-immediate watcher', () => {
284+
const cleanupSpy = vi.fn()
285+
const cbSpy = vi.fn(() => {
286+
onScopeDispose(cleanupSpy)
287+
})
288+
const scope = new EffectScope()
289+
290+
scope.run(() => {
291+
const signal = ref(false)
292+
watch(signal, cbSpy)
293+
signal.value = true
294+
})
295+
296+
scope.stop()
297+
298+
expect(cbSpy).toBeCalledTimes(1)
299+
expect(cleanupSpy).toBeCalledTimes(1)
300+
})
280301
})

packages/runtime-core/__tests__/apiWatch.spec.ts

+20
Original file line numberDiff line numberDiff line change
@@ -2010,4 +2010,24 @@ describe('api: watch', () => {
20102010
createApp(App).mount(root)
20112011
expect(onCleanup).toBeCalledTimes(0)
20122012
})
2013+
2014+
// #12681
2015+
test('onScopeDispose inside non-immediate watcher that ran', () => {
2016+
const cleanupSpy = vi.fn()
2017+
const cbSpy = vi.fn(() => {
2018+
onScopeDispose(cleanupSpy)
2019+
})
2020+
const scope = effectScope()
2021+
2022+
scope.run(() => {
2023+
const signal = ref(false)
2024+
watch(signal, cbSpy)
2025+
signal.value = true
2026+
})
2027+
2028+
scope.stop()
2029+
2030+
expect(cbSpy).toBeCalledTimes(1)
2031+
expect(cleanupSpy).toBeCalledTimes(1)
2032+
})
20132033
})

0 commit comments

Comments
 (0)