Browse Source

test: test for app.mixin & warnHandler

Evan You 6 years ago
parent
commit
4c075803b5

+ 85 - 6
packages/runtime-core/__tests__/apiApp.spec.ts

@@ -10,7 +10,8 @@ import {
   resolveDirective,
   applyDirectives,
   Plugin,
-  ref
+  ref,
+  getCurrentInstance
 } from '@vue/runtime-test'
 
 describe('api: createApp', () => {
@@ -139,6 +140,78 @@ describe('api: createApp', () => {
     expect(spy3).toHaveBeenCalled()
   })
 
+  test('mixin', () => {
+    const calls: string[] = []
+    const mixinA = {
+      data() {
+        return {
+          a: 1
+        }
+      },
+      created(this: any) {
+        calls.push('mixinA created')
+        expect(this.a).toBe(1)
+        expect(this.b).toBe(2)
+        expect(this.c).toBe(3)
+      },
+      mounted() {
+        calls.push('mixinA mounted')
+      }
+    }
+    const mixinB = {
+      data() {
+        return {
+          b: 2
+        }
+      },
+      created(this: any) {
+        calls.push('mixinB created')
+        expect(this.a).toBe(1)
+        expect(this.b).toBe(2)
+        expect(this.c).toBe(3)
+      },
+      mounted() {
+        calls.push('mixinB mounted')
+      }
+    }
+    const Comp = {
+      data() {
+        return {
+          c: 3
+        }
+      },
+      created(this: any) {
+        calls.push('comp created')
+        expect(this.a).toBe(1)
+        expect(this.b).toBe(2)
+        expect(this.c).toBe(3)
+      },
+      mounted() {
+        calls.push('comp mounted')
+      },
+      render(this: any) {
+        return `${this.a}${this.b}${this.c}`
+      }
+    }
+
+    const app = createApp()
+    app.mixin(mixinA)
+    app.mixin(mixinB)
+
+    const root = nodeOps.createElement('div')
+    app.mount(Comp, root)
+
+    expect(serializeInner(root)).toBe(`123`)
+    expect(calls).toEqual([
+      'mixinA created',
+      'mixinB created',
+      'comp created',
+      'mixinA mounted',
+      'mixinB mounted',
+      'comp mounted'
+    ])
+  })
+
   test('use', () => {
     const PluginA: Plugin = app => app.provide('foo', 1)
     const PluginB: Plugin = {
@@ -193,18 +266,24 @@ describe('api: createApp', () => {
 
   test('config.warnHandler', () => {
     const app = createApp()
+    let ctx: any
 
     const handler = (app.config.warnHandler = jest.fn(
-      (msg, instance, trace) => {}
+      (msg, instance, trace) => {
+        expect(msg).toMatch(`Component is missing render function`)
+        expect(instance).toBe(ctx.renderProxy)
+        expect(trace).toMatch(`Hello`)
+      }
     ))
 
     const Root = {
-      setup() {}
+      name: 'Hello',
+      setup() {
+        ctx = getCurrentInstance()
+      }
     }
 
     app.mount(Root, nodeOps.createElement('div'))
-    expect(handler).toHaveBeenCalled()
+    expect(handler).toHaveBeenCalledTimes(1)
   })
-
-  test.todo('mixin')
 })

+ 2 - 7
packages/runtime-core/src/apiOptions.ts

@@ -146,15 +146,10 @@ export function applyOptions(
   } = options
 
   const globalMixins = instance.appContext.mixins
-
-  // beforeCreate
+  // applyOptions is called non-as-mixin once per instance
   if (!asMixin) {
     callSyncHook('beforeCreate', options, ctx, globalMixins)
-  }
-
-  // global mixins are applied first, and only if this is a non-mixin call
-  // so that they are applied once per instance.
-  if (!asMixin) {
+    // global mixins are applied first
     applyMixins(instance, globalMixins)
   }
   // extending a base component...