diff --git a/packages/create-instance/create-instance.js b/packages/create-instance/create-instance.js index b96872853..ea0cc8af3 100644 --- a/packages/create-instance/create-instance.js +++ b/packages/create-instance/create-instance.js @@ -6,7 +6,7 @@ import { addEventLogger } from './log-events' import { createComponentStubs } from 'shared/stub-components' import { throwError, warn, vueVersion } from 'shared/util' import { compileTemplate } from 'shared/compile-template' -import deleteMountingOptions from './delete-mounting-options' +import extractInstanceOptions from './extract-instance-options' import createFunctionalComponent from './create-functional-component' import { componentNeedsCompiling } from 'shared/validators' import { validateSlots } from './validate-slots' @@ -20,6 +20,18 @@ export default function createInstance ( // Remove cached constructor delete component._Ctor + // mounting options are vue-test-utils specific + // + // instance options are options that are passed to the + // root instance when it's instantiated + // + // component options are the root components options + const componentOptions = typeof component === 'function' + ? component.extendOptions + : component + + const instanceOptions = extractInstanceOptions(options) + if (options.mocks) { addMocks(options.mocks, _Vue) } @@ -40,12 +52,6 @@ export default function createInstance ( addEventLogger(_Vue) - const instanceOptions = { - ...options - } - - deleteMountingOptions(instanceOptions) - const stubComponents = createComponentStubs( // $FlowIgnore component.components, @@ -67,9 +73,9 @@ export default function createInstance ( ) } }) - Object.keys(component.components || {}).forEach(c => { + Object.keys(componentOptions.components || {}).forEach(c => { if ( - component.components[c].extendOptions && + componentOptions.components[c].extendOptions && !instanceOptions.components[c] ) { if (options.logModifiedComponents) { @@ -82,7 +88,9 @@ export default function createInstance ( `option.` ) } - instanceOptions.components[c] = _Vue.extend(component.components[c]) + instanceOptions.components[c] = _Vue.extend( + componentOptions.components[c] + ) } }) diff --git a/packages/create-instance/delete-mounting-options.js b/packages/create-instance/delete-mounting-options.js deleted file mode 100644 index 45c38a8c8..000000000 --- a/packages/create-instance/delete-mounting-options.js +++ /dev/null @@ -1,12 +0,0 @@ -export default function deleteMountingOptions (options) { - delete options.attachToDocument - delete options.mocks - delete options.slots - delete options.localVue - delete options.stubs - delete options.context - delete options.clone - delete options.attrs - delete options.listeners - delete options.propsData -} diff --git a/packages/create-instance/extract-instance-options.js b/packages/create-instance/extract-instance-options.js new file mode 100644 index 000000000..f72851ba2 --- /dev/null +++ b/packages/create-instance/extract-instance-options.js @@ -0,0 +1,20 @@ +const MOUNTING_OPTIONS = [ + 'attachToDocument', + 'mocks', + 'slots', + 'localVue', + 'stubs', + 'context', + 'clone', + 'attrs', + 'listeners', + 'propsData' +] + +export default function extractInstanceOptions (options) { + const instanceOptions = { ...options } + MOUNTING_OPTIONS.forEach(mountingOption => { + delete instanceOptions[mountingOption] + }) + return instanceOptions +} diff --git a/test/specs/mounting-options/localVue.spec.js b/test/specs/mounting-options/localVue.spec.js index 2f51b8e20..a638a577e 100644 --- a/test/specs/mounting-options/localVue.spec.js +++ b/test/specs/mounting-options/localVue.spec.js @@ -70,6 +70,21 @@ describeWithMountingMethods('options.localVue', mountingMethod => { } }) + it('is applies to child extended components', () => { + const ChildComponent = Vue.extend({ + template: '
{{$route.params}}
' + }) + const TestComponent = Vue.extend({ + template: '', + components: { ChildComponent } + }) + const localVue = createLocalVue() + localVue.prototype.$route = {} + mountingMethod(TestComponent, { + localVue + }) + }) + it('does not add created mixin to localVue', () => { const localVue = createLocalVue() mountingMethod({ render: () => {} }, {