]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
test: add more complete test for componentProxy (#174)
authorCr <631807682@qq.com>
Thu, 10 Oct 2019 14:02:55 +0000 (22:02 +0800)
committerEvan You <yyx990803@gmail.com>
Thu, 10 Oct 2019 14:02:55 +0000 (10:02 -0400)
packages/runtime-core/__tests__/componentProxy.spec.ts

index b102889ab06e6f50d3b66bce376e46087845ebec..aa951c3a60957a7e35110e8d622ef2220192a7c5 100644 (file)
-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) => {
-  const component = {
-    render() {}
-  }
-  const root = nodeOps.createElement('div')
-  return createApp().mount(component, root, props)
-}
+describe('component: proxy', () => {
+  mockWarn()
 
-describe('component proxy', () => {
-  describe('warnings', () => {
-    mockWarn()
+  it('data', () => {
+    const app = createApp()
+    let instance: ComponentInternalInstance
+    let instanceProxy: any
+    const Comp = {
+      data() {
+        return {
+          foo: 1
+        }
+      },
+      mounted() {
+        instance = getCurrentInstance()!
+        instanceProxy = this
+      },
+      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 public property', () => {
-      const app = createTestInstance()
+  it('renderContext', () => {
+    const app = createApp()
+    let instance: ComponentInternalInstance
+    let instanceProxy: any
+    const Comp = {
+      setup() {
+        return {
+          foo: 1
+        }
+      },
+      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)
+  })
 
-      try {
-        app.$props = { foo: 'bar' }
-      } catch {
-        expect(
-          'Attempting to mutate public property "$props". ' +
-            'Properties starting with $ are reserved and readonly.'
-        ).toHaveBeenWarned()
+  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()
+  })
 
-    test('Attempting to mutate prop', () => {
-      const app = createTestInstance({ foo: 'foo' })
+  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()
+  })
 
-      try {
-        app.foo = 'bar'
-      } catch {
-        expect(
-          'Attempting to mutate prop "foo". Props are readonly.'
-        ).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)
   })
 })