Skip to content

Commit ac853ff

Browse files
committed
test: fix script setup helpers tests
1 parent 075889e commit ac853ff

File tree

3 files changed

+39
-20
lines changed

3 files changed

+39
-20
lines changed

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

+29-17
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ import {
55
render,
66
SetupContext
77
} from '@vue/runtime-test'
8-
import { defineEmits, defineProps, useContext } from '../src/apiSetupHelpers'
8+
import {
9+
defineEmits,
10+
defineProps,
11+
useAttrs,
12+
useSlots
13+
} from '../src/apiSetupHelpers'
914

1015
describe('SFC <script setup> helpers', () => {
1116
test('should warn runtime usage', () => {
@@ -16,34 +21,41 @@ describe('SFC <script setup> helpers', () => {
1621
expect(`defineEmits() is a compiler-hint`).toHaveBeenWarned()
1722
})
1823

19-
test('useContext (no args)', () => {
20-
let ctx: SetupContext | undefined
24+
test('useSlots / useAttrs (no args)', () => {
25+
let slots: SetupContext['slots'] | undefined
26+
let attrs: SetupContext['attrs'] | undefined
2127
const Comp = {
2228
setup() {
23-
ctx = useContext()
29+
slots = useSlots()
30+
attrs = useAttrs()
2431
return () => {}
2532
}
2633
}
27-
render(h(Comp), nodeOps.createElement('div'))
28-
expect(ctx).toMatchObject({
29-
attrs: {},
30-
slots: {}
31-
})
32-
expect(typeof ctx!.emit).toBe('function')
34+
const passedAttrs = { id: 'foo' }
35+
const passedSlots = {
36+
default: () => {},
37+
x: () => {}
38+
}
39+
render(h(Comp, passedAttrs, passedSlots), nodeOps.createElement('div'))
40+
expect(typeof slots!.default).toBe('function')
41+
expect(typeof slots!.x).toBe('function')
42+
expect(attrs).toMatchObject(passedAttrs)
3343
})
3444

35-
test('useContext (with args)', () => {
45+
test('useSlots / useAttrs (with args)', () => {
46+
let slots: SetupContext['slots'] | undefined
47+
let attrs: SetupContext['attrs'] | undefined
3648
let ctx: SetupContext | undefined
37-
let ctxArg: SetupContext | undefined
3849
const Comp = defineComponent({
39-
setup(_, _ctxArg) {
40-
ctx = useContext()
41-
ctxArg = _ctxArg
50+
setup(_, _ctx) {
51+
slots = useSlots()
52+
attrs = useAttrs()
53+
ctx = _ctx
4254
return () => {}
4355
}
4456
})
4557
render(h(Comp), nodeOps.createElement('div'))
46-
expect(ctx).toBeDefined()
47-
expect(ctx).toBe(ctxArg)
58+
expect(slots).toBe(ctx!.slots)
59+
expect(attrs).toBe(ctx!.attrs)
4860
})
4961
})

packages/runtime-core/src/apiSetupHelpers.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ export function useContext(): SetupContext {
7171
`next minor release. Use \`useSlots()\` and \`useAttrs()\` instead.`
7272
)
7373
}
74+
return getContext()
75+
}
76+
77+
function getContext(): SetupContext {
7478
const i = getCurrentInstance()!
7579
if (__DEV__ && !i) {
7680
warn(`useContext() called without active instance.`)
@@ -79,9 +83,9 @@ export function useContext(): SetupContext {
7983
}
8084

8185
export function useSlots(): SetupContext['slots'] {
82-
return useContext().slots
86+
return getContext().slots
8387
}
8488

8589
export function useAttrs(): SetupContext['attrs'] {
86-
return useContext().attrs
90+
return getContext().attrs
8791
}

packages/runtime-core/src/component.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -841,11 +841,14 @@ export function createSetupContext(
841841
}
842842

843843
if (__DEV__) {
844+
let attrs: Data
844845
// We use getters in dev in case libs like test-utils overwrite instance
845846
// properties (overwrites should not be done in prod)
846847
return Object.freeze({
847848
get attrs() {
848-
return new Proxy(instance.attrs, attrDevProxyHandlers)
849+
return (
850+
attrs || (attrs = new Proxy(instance.attrs, attrDevProxyHandlers))
851+
)
849852
},
850853
get slots() {
851854
return shallowReadonly(instance.slots)

0 commit comments

Comments
 (0)