Skip to content

Commit

Permalink
fix(runtime-core): allow spying on proxy methods regression vuejs#5415
Browse files Browse the repository at this point in the history
  • Loading branch information
lidlanca committed Feb 12, 2022
1 parent cea82cf commit 4f55feb
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 4 deletions.
38 changes: 35 additions & 3 deletions packages/runtime-core/__tests__/componentPublicInstance.spec.ts
Expand Up @@ -257,13 +257,13 @@ describe('component: proxy', () => {
expect(instanceProxy.isDisplayed).toBe(true)
})

test('allow spying on proxy methods', () => {
test('allow jest spying on proxy methods with Object.defineProperty', () => {
let instanceProxy: any
const Comp = {
render() {},
setup() {
return {
toggle() {}
toggle() { return 'a'}
}
},
mounted() {
Expand All @@ -274,10 +274,42 @@ describe('component: proxy', () => {
const app = createApp(Comp)

app.mount(nodeOps.createElement('div'))

// access 'toggle' to ensure key is cached
let v1 = instanceProxy.toggle()

// reconfigure "toggle" to be getter based.
let getCalledTimes = 0
Object.defineProperty(instanceProxy, 'toggle', {
get(){
getCalledTimes++
return ()=> 'b'
}
})

const spy = jest.spyOn(instanceProxy, 'toggle')
// getter should not be evaluated on definition
expect(getCalledTimes).toEqual(0)

// invoke "toggle" after "defineProperty"
let v2 = instanceProxy.toggle()
expect(getCalledTimes).toEqual(1)

// expect toggle getter not to be cached. it can't be
instanceProxy.toggle()
expect(getCalledTimes).toEqual(2)

// attaching jest spy, triggers the getter once, cache it and override the property.
// also uses Object.defineProperty
const spy = jest.spyOn(instanceProxy, 'toggle')
expect(getCalledTimes).toEqual(3)

// toggle getter is not going to be evaluated due to jest wrapper caching it result
let v3 = instanceProxy.toggle()
expect(getCalledTimes).toEqual(3)

expect(v1).toEqual('a')
expect(v2).toEqual('b')
expect(v3).toEqual('b')

expect(spy).toHaveBeenCalled()
})
Expand Down
2 changes: 1 addition & 1 deletion packages/runtime-core/src/componentPublicInstance.ts
Expand Up @@ -455,7 +455,7 @@ export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
descriptor: PropertyDescriptor
) {
if (descriptor.get != null) {
this.set!(target, key, descriptor.get(), null)
target.$.accessCache[key] = 0;
} else if (descriptor.value != null) {
this.set!(target, key, descriptor.value, null)
}
Expand Down

0 comments on commit 4f55feb

Please sign in to comment.