test: test for app.mixin & warnHandler

This commit is contained in:
Evan You 2019-09-05 20:59:45 -04:00
parent 891f21b010
commit 4c075803b5
2 changed files with 87 additions and 13 deletions

View File

@ -10,7 +10,8 @@ import {
resolveDirective, resolveDirective,
applyDirectives, applyDirectives,
Plugin, Plugin,
ref ref,
getCurrentInstance
} from '@vue/runtime-test' } from '@vue/runtime-test'
describe('api: createApp', () => { describe('api: createApp', () => {
@ -139,6 +140,78 @@ describe('api: createApp', () => {
expect(spy3).toHaveBeenCalled() 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', () => { test('use', () => {
const PluginA: Plugin = app => app.provide('foo', 1) const PluginA: Plugin = app => app.provide('foo', 1)
const PluginB: Plugin = { const PluginB: Plugin = {
@ -193,18 +266,24 @@ describe('api: createApp', () => {
test('config.warnHandler', () => { test('config.warnHandler', () => {
const app = createApp() const app = createApp()
let ctx: any
const handler = (app.config.warnHandler = jest.fn( 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 = { const Root = {
setup() {} name: 'Hello',
setup() {
ctx = getCurrentInstance()
}
} }
app.mount(Root, nodeOps.createElement('div')) app.mount(Root, nodeOps.createElement('div'))
expect(handler).toHaveBeenCalled() expect(handler).toHaveBeenCalledTimes(1)
}) })
test.todo('mixin')
}) })

View File

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