From 4c075803b5852d9dbad0240bd6e0ea44265bc2ce Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 5 Sep 2019 20:59:45 -0400 Subject: [PATCH] test: test for app.mixin & warnHandler --- .../runtime-core/__tests__/apiApp.spec.ts | 91 +++++++++++++++++-- packages/runtime-core/src/apiOptions.ts | 9 +- 2 files changed, 87 insertions(+), 13 deletions(-) diff --git a/packages/runtime-core/__tests__/apiApp.spec.ts b/packages/runtime-core/__tests__/apiApp.spec.ts index 91ddfbb1e..d01ffb254 100644 --- a/packages/runtime-core/__tests__/apiApp.spec.ts +++ b/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') }) diff --git a/packages/runtime-core/src/apiOptions.ts b/packages/runtime-core/src/apiOptions.ts index fb61b96ad..3863d64c4 100644 --- a/packages/runtime-core/src/apiOptions.ts +++ b/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...