Skip to content

Commit 4f55feb

Browse files
committed
fix(runtime-core): allow spying on proxy methods regression vuejs#5415 vuejs#4216
1 parent cea82cf commit 4f55feb

File tree

2 files changed

+36
-4
lines changed

2 files changed

+36
-4
lines changed

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

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,13 +257,13 @@ describe('component: proxy', () => {
257257
expect(instanceProxy.isDisplayed).toBe(true)
258258
})
259259

260-
test('allow spying on proxy methods', () => {
260+
test('allow jest spying on proxy methods with Object.defineProperty', () => {
261261
let instanceProxy: any
262262
const Comp = {
263263
render() {},
264264
setup() {
265265
return {
266-
toggle() {}
266+
toggle() { return 'a'}
267267
}
268268
},
269269
mounted() {
@@ -274,10 +274,42 @@ describe('component: proxy', () => {
274274
const app = createApp(Comp)
275275

276276
app.mount(nodeOps.createElement('div'))
277+
278+
// access 'toggle' to ensure key is cached
279+
let v1 = instanceProxy.toggle()
280+
281+
// reconfigure "toggle" to be getter based.
282+
let getCalledTimes = 0
283+
Object.defineProperty(instanceProxy, 'toggle', {
284+
get(){
285+
getCalledTimes++
286+
return ()=> 'b'
287+
}
288+
})
277289

278-
const spy = jest.spyOn(instanceProxy, 'toggle')
290+
// getter should not be evaluated on definition
291+
expect(getCalledTimes).toEqual(0)
292+
293+
// invoke "toggle" after "defineProperty"
294+
let v2 = instanceProxy.toggle()
295+
expect(getCalledTimes).toEqual(1)
279296

297+
// expect toggle getter not to be cached. it can't be
280298
instanceProxy.toggle()
299+
expect(getCalledTimes).toEqual(2)
300+
301+
// attaching jest spy, triggers the getter once, cache it and override the property.
302+
// also uses Object.defineProperty
303+
const spy = jest.spyOn(instanceProxy, 'toggle')
304+
expect(getCalledTimes).toEqual(3)
305+
306+
// toggle getter is not going to be evaluated due to jest wrapper caching it result
307+
let v3 = instanceProxy.toggle()
308+
expect(getCalledTimes).toEqual(3)
309+
310+
expect(v1).toEqual('a')
311+
expect(v2).toEqual('b')
312+
expect(v3).toEqual('b')
281313

282314
expect(spy).toHaveBeenCalled()
283315
})

packages/runtime-core/src/componentPublicInstance.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
455455
descriptor: PropertyDescriptor
456456
) {
457457
if (descriptor.get != null) {
458-
this.set!(target, key, descriptor.get(), null)
458+
target.$.accessCache[key] = 0;
459459
} else if (descriptor.value != null) {
460460
this.set!(target, key, descriptor.value, null)
461461
}

0 commit comments

Comments
 (0)