test: add more complete test for componentProxy (#174)
This commit is contained in:
parent
a4090a227c
commit
211f5b7a45
@ -1,40 +1,132 @@
|
|||||||
import { createApp, nodeOps, mockWarn } from '@vue/runtime-test'
|
import {
|
||||||
|
createApp,
|
||||||
|
getCurrentInstance,
|
||||||
|
nodeOps,
|
||||||
|
mockWarn
|
||||||
|
} from '@vue/runtime-test'
|
||||||
|
import { ComponentInternalInstance } from '../src/component'
|
||||||
|
|
||||||
const createTestInstance = (props?: any) => {
|
describe('component: proxy', () => {
|
||||||
const component = {
|
mockWarn()
|
||||||
render() {}
|
|
||||||
}
|
|
||||||
const root = nodeOps.createElement('div')
|
|
||||||
return createApp().mount(component, root, props)
|
|
||||||
}
|
|
||||||
|
|
||||||
describe('component proxy', () => {
|
it('data', () => {
|
||||||
describe('warnings', () => {
|
const app = createApp()
|
||||||
mockWarn()
|
let instance: ComponentInternalInstance
|
||||||
|
let instanceProxy: any
|
||||||
test('Attempting to mutate public property', () => {
|
const Comp = {
|
||||||
const app = createTestInstance()
|
data() {
|
||||||
|
return {
|
||||||
try {
|
foo: 1
|
||||||
app.$props = { foo: 'bar' }
|
}
|
||||||
} catch {
|
},
|
||||||
expect(
|
mounted() {
|
||||||
'Attempting to mutate public property "$props". ' +
|
instance = getCurrentInstance()!
|
||||||
'Properties starting with $ are reserved and readonly.'
|
instanceProxy = this
|
||||||
).toHaveBeenWarned()
|
},
|
||||||
|
render() {
|
||||||
|
return null
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
app.mount(Comp, nodeOps.createElement('div'))
|
||||||
|
expect(instanceProxy.foo).toBe(1)
|
||||||
|
instanceProxy.foo = 2
|
||||||
|
expect(instance!.data.foo).toBe(2)
|
||||||
|
})
|
||||||
|
|
||||||
test('Attempting to mutate prop', () => {
|
it('renderContext', () => {
|
||||||
const app = createTestInstance({ foo: 'foo' })
|
const app = createApp()
|
||||||
|
let instance: ComponentInternalInstance
|
||||||
try {
|
let instanceProxy: any
|
||||||
app.foo = 'bar'
|
const Comp = {
|
||||||
} catch {
|
setup() {
|
||||||
expect(
|
return {
|
||||||
'Attempting to mutate prop "foo". Props are readonly.'
|
foo: 1
|
||||||
).toHaveBeenWarned()
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
instance = getCurrentInstance()!
|
||||||
|
instanceProxy = this
|
||||||
|
},
|
||||||
|
render() {
|
||||||
|
return null
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
app.mount(Comp, nodeOps.createElement('div'))
|
||||||
|
expect(instanceProxy.foo).toBe(1)
|
||||||
|
instanceProxy.foo = 2
|
||||||
|
expect(instance!.renderContext.foo).toBe(2)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('propsProxy', () => {
|
||||||
|
const app = createApp()
|
||||||
|
let instance: ComponentInternalInstance
|
||||||
|
let instanceProxy: any
|
||||||
|
const Comp = {
|
||||||
|
props: {
|
||||||
|
foo: {
|
||||||
|
type: Number,
|
||||||
|
default: 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setup() {
|
||||||
|
return () => null
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
instance = getCurrentInstance()!
|
||||||
|
instanceProxy = this
|
||||||
|
}
|
||||||
|
}
|
||||||
|
app.mount(Comp, nodeOps.createElement('div'))
|
||||||
|
expect(instanceProxy.foo).toBe(1)
|
||||||
|
expect(instance!.propsProxy!.foo).toBe(1)
|
||||||
|
expect(() => (instanceProxy.foo = 2)).toThrow(TypeError)
|
||||||
|
expect(`Attempting to mutate prop "foo"`).toHaveBeenWarned()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('methods', () => {
|
||||||
|
const app = createApp()
|
||||||
|
let instance: ComponentInternalInstance
|
||||||
|
let instanceProxy: any
|
||||||
|
const Comp = {
|
||||||
|
setup() {
|
||||||
|
return () => null
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
instance = getCurrentInstance()!
|
||||||
|
instanceProxy = this
|
||||||
|
}
|
||||||
|
}
|
||||||
|
app.mount(Comp, nodeOps.createElement('div'))
|
||||||
|
expect(instanceProxy.$data).toBe(instance!.data)
|
||||||
|
expect(instanceProxy.$props).toBe(instance!.propsProxy)
|
||||||
|
expect(instanceProxy.$attrs).toBe(instance!.attrs)
|
||||||
|
expect(instanceProxy.$slots).toBe(instance!.slots)
|
||||||
|
expect(instanceProxy.$refs).toBe(instance!.refs)
|
||||||
|
expect(instanceProxy.$parent).toBe(instance!.parent)
|
||||||
|
expect(instanceProxy.$root).toBe(instance!.root)
|
||||||
|
expect(instanceProxy.$emit).toBe(instance!.emit)
|
||||||
|
expect(instanceProxy.$el).toBe(instance!.vnode.el)
|
||||||
|
expect(instanceProxy.$options).toBe(instance!.type)
|
||||||
|
expect(() => (instanceProxy.$data = {})).toThrow(TypeError)
|
||||||
|
expect(`Attempting to mutate public property "$data"`).toHaveBeenWarned()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('user', async () => {
|
||||||
|
const app = createApp()
|
||||||
|
let instance: ComponentInternalInstance
|
||||||
|
let instanceProxy: any
|
||||||
|
const Comp = {
|
||||||
|
setup() {
|
||||||
|
return () => null
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
instance = getCurrentInstance()!
|
||||||
|
instanceProxy = this
|
||||||
|
}
|
||||||
|
}
|
||||||
|
app.mount(Comp, nodeOps.createElement('div'))
|
||||||
|
instanceProxy.foo = 1
|
||||||
|
expect(instanceProxy.foo).toBe(1)
|
||||||
|
expect(instance!.user.foo).toBe(1)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user