From e03831f9d5a0f49294bf7595615ae0a529f91912 Mon Sep 17 00:00:00 2001 From: Joshua Cannon Date: Sat, 22 Feb 2020 08:34:53 -0600 Subject: [PATCH] fix: stub globally registered components When specifying the components to stub, merge the globally registered components into the locally registered ones. (fix #1272) --- packages/create-instance/create-instance.js | 8 +++++++- test/specs/mounting-options/stubs.spec.js | 22 +++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/create-instance/create-instance.js b/packages/create-instance/create-instance.js index fb7cfc292..fca1bc237 100644 --- a/packages/create-instance/create-instance.js +++ b/packages/create-instance/create-instance.js @@ -52,8 +52,14 @@ export default function createInstance( // root instance when it's instantiated const instanceOptions = extractInstanceOptions(options) + const globalComponents = _Vue.options.components || {} + const componentsToStub = Object.assign( + Object.create(globalComponents), + componentOptions.components + ) + const stubComponentsObject = createStubsFromStubsObject( - componentOptions.components, + componentsToStub, // $FlowIgnore options.stubs, _Vue diff --git a/test/specs/mounting-options/stubs.spec.js b/test/specs/mounting-options/stubs.spec.js index df6efeebe..905c369a7 100644 --- a/test/specs/mounting-options/stubs.spec.js +++ b/test/specs/mounting-options/stubs.spec.js @@ -568,4 +568,26 @@ describeWithShallowAndMount('options.stub', mountingMethod => { expect(wrapper.find(ToStub).exists()).to.be.false expect(wrapper.find(Stub).exists()).to.be.true }) + + it('stubs globally registered components', () => { + const ChildComponent = { + template: '
', + props: ['propA'], + name: 'child-component' + } + const TestComponent = { + template: '' + } + + Vue.component('child-component', ChildComponent) + const wrapper = mountingMethod(TestComponent, { + stubs: { + ChildComponent: true + } + }) + const result = wrapper.find(ChildComponent) + expect(result.exists()).to.be.true + expect(result.props().propA).to.equal('A') + delete Vue.options.components['child-component'] + }) })