test: add more complete test for componentProxy (#174)

This commit is contained in:
Cr 2019-10-10 22:02:55 +08:00 committed by Evan You
parent a4090a227c
commit 211f5b7a45

View File

@ -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)
}) })
}) })