Skip to content
This repository was archived by the owner on Jul 19, 2025. It is now read-only.

Commit aca7979

Browse files
committed
test(runtime-vapor): api lifecycle hooks (onRenderTracked/onRenderTrigger)
1 parent df8672c commit aca7979

File tree

1 file changed

+74
-19
lines changed

1 file changed

+74
-19
lines changed

packages/runtime-vapor/__tests__/apiLifecycle.spec.ts

Lines changed: 74 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
import {
2+
type DebuggerEvent,
3+
ITERATE_KEY,
4+
TrackOpTypes,
5+
TriggerOpTypes,
6+
reactive,
7+
} from '@vue/reactivity'
18
import {
29
type InjectionKey,
310
type Ref,
@@ -337,49 +344,97 @@ describe('api: lifecycle hooks', () => {
337344
})
338345

339346
test('onRenderTracked', async () => {
340-
const onTrackedFn = vi.fn()
341-
const count = ref(0)
342-
const { host, render } = define({
347+
const events: DebuggerEvent[] = []
348+
const onTrack = vi.fn((e: DebuggerEvent) => {
349+
events.push(e)
350+
})
351+
const obj = reactive({ foo: 1, bar: 2 })
352+
353+
const { render } = define({
343354
setup() {
344-
onRenderTracked(onTrackedFn)
355+
onRenderTracked(onTrack)
345356
return (() => {
346357
const n0 = createTextNode()
347358
renderEffect(() => {
348-
setText(n0, count.value)
359+
setText(n0, [obj.foo, 'bar' in obj, Object.keys(obj).join('')])
349360
})
350361
return n0
351362
})()
352363
},
353364
})
365+
354366
render()
355-
await nextTick()
356-
expect(onTrackedFn).toBeCalled()
357-
expect(host.innerHTML).toBe('0')
358-
// TODO: compatibility with packages/runtime-core/__tests__/apiLifecycle.spec.ts
367+
expect(onTrack).toHaveBeenCalledTimes(3)
368+
expect(events).toMatchObject([
369+
{
370+
target: obj,
371+
type: TrackOpTypes.GET,
372+
key: 'foo',
373+
},
374+
{
375+
target: obj,
376+
type: TrackOpTypes.HAS,
377+
key: 'bar',
378+
},
379+
{
380+
target: obj,
381+
type: TrackOpTypes.ITERATE,
382+
key: ITERATE_KEY,
383+
},
384+
])
359385
})
360386

361387
test('onRenderTrigger', async () => {
362-
const onRenderTriggerFn = vi.fn()
363-
const count = ref(0)
364-
const { host, render } = define({
388+
const events: DebuggerEvent[] = []
389+
const onTrigger = vi.fn((e: DebuggerEvent) => {
390+
events.push(e)
391+
})
392+
const obj = reactive<{
393+
foo: number
394+
bar?: number
395+
}>({ foo: 1, bar: 2 })
396+
397+
const { render } = define({
365398
setup() {
366-
onRenderTriggered(onRenderTriggerFn)
399+
onRenderTriggered(onTrigger)
367400
return (() => {
368401
const n0 = createTextNode()
369402
renderEffect(() => {
370-
setText(n0, count.value)
403+
setText(n0, [obj.foo, 'bar' in obj, Object.keys(obj).join('')])
371404
})
372405
return n0
373406
})()
374407
},
375408
})
409+
376410
render()
377-
count.value++
411+
412+
obj.foo++
378413
await nextTick()
379-
expect(onRenderTriggerFn).toBeCalled()
380-
expect(onRenderTriggerFn).toHaveBeenCalledOnce()
381-
expect(host.innerHTML).toBe('1')
382-
// TODO: compatibility with packages/runtime-core/__tests__/apiLifecycle.spec.ts
414+
expect(onTrigger).toHaveBeenCalledTimes(1)
415+
expect(events[0]).toMatchObject({
416+
type: TriggerOpTypes.SET,
417+
key: 'foo',
418+
oldValue: 1,
419+
newValue: 2,
420+
})
421+
422+
delete obj.bar
423+
await nextTick()
424+
expect(onTrigger).toHaveBeenCalledTimes(2)
425+
expect(events[1]).toMatchObject({
426+
type: TriggerOpTypes.DELETE,
427+
key: 'bar',
428+
oldValue: 2,
429+
})
430+
;(obj as any).baz = 3
431+
await nextTick()
432+
expect(onTrigger).toHaveBeenCalledTimes(3)
433+
expect(events[2]).toMatchObject({
434+
type: TriggerOpTypes.ADD,
435+
key: 'baz',
436+
newValue: 3,
437+
})
383438
})
384439

385440
it('runs shared hook fn for each instance', async () => {

0 commit comments

Comments
 (0)