From: Evan You Date: Fri, 6 Sep 2019 00:59:45 +0000 (-0400) Subject: test: test for app.mixin & warnHandler X-Git-Tag: v3.0.0-alpha.0~815 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4c075803b5852d9dbad0240bd6e0ea44265bc2ce;p=thirdparty%2Fvuejs%2Fcore.git test: test for app.mixin & warnHandler --- diff --git a/packages/runtime-core/__tests__/apiApp.spec.ts b/packages/runtime-core/__tests__/apiApp.spec.ts index 91ddfbb1ed..d01ffb254f 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 fb61b96adc..3863d64c42 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...