From dc58676f7aa2539039088915a3ad7f8e5b5ac29e Mon Sep 17 00:00:00 2001 From: eddyerburgh Date: Sat, 27 Oct 2018 03:32:12 +0100 Subject: [PATCH 1/4] refactor: extract component options --- packages/create-instance/create-instance.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/create-instance/create-instance.js b/packages/create-instance/create-instance.js index 7b2a8f761..e09d97ca2 100644 --- a/packages/create-instance/create-instance.js +++ b/packages/create-instance/create-instance.js @@ -104,11 +104,12 @@ export default function createInstance ( component.options._base = _Vue } + const componentOptions = typeof component === 'function' + ? component.options + : component // extend component from _Vue to add properties and mixins // extend does not work correctly for sub class components in Vue < 2.2 - const Constructor = typeof component === 'function' - ? _Vue.extend(component.options).extend(instanceOptions) - : _Vue.extend(component).extend(instanceOptions) + const Constructor = _Vue.extend(componentOptions).extend(instanceOptions) // used to identify extended component using constructor Constructor.options.$_vueTestUtils_original = component From 879c31a94175123264fb5fc36df5fa17fd11eb46 Mon Sep 17 00:00:00 2001 From: eddyerburgh Date: Sat, 27 Oct 2018 20:16:42 +0100 Subject: [PATCH 2/4] fix: extend inlined constructor functions --- packages/create-instance/create-instance.js | 2 ++ packages/create-instance/patch-render.js | 20 ++++++++++++++++++++ test/specs/mounting-options/localVue.spec.js | 17 +++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 packages/create-instance/patch-render.js diff --git a/packages/create-instance/create-instance.js b/packages/create-instance/create-instance.js index e09d97ca2..a3b23fdf6 100644 --- a/packages/create-instance/create-instance.js +++ b/packages/create-instance/create-instance.js @@ -4,6 +4,7 @@ import { createSlotVNodes } from './create-slot-vnodes' import addMocks from './add-mocks' import { addEventLogger } from './log-events' import { addStubs } from './add-stubs' +import { patchRender } from './patch-render' import { throwError, vueVersion } from 'shared/util' import { compileTemplate, @@ -60,6 +61,7 @@ export default function createInstance ( addEventLogger(_Vue) addMocks(options.mocks, _Vue) addStubs(component, options.stubs, _Vue, options.shouldProxy) + patchRender(_Vue) if ( (component.options && component.options.functional) || diff --git a/packages/create-instance/patch-render.js b/packages/create-instance/patch-render.js new file mode 100644 index 000000000..87479e04f --- /dev/null +++ b/packages/create-instance/patch-render.js @@ -0,0 +1,20 @@ +import { addHook } from './add-hook' + +// This is used to extend component constructors +// used directly in a render function +// see # +export function patchRender (_Vue) { + addHook(_Vue.options, 'beforeCreate', function () { + const createElementSave = this.$createElement + this.$createElement = function (el, ...args) { + if ( + typeof el === 'function' && + el.super !== _Vue && + !el.options.$_vueTestUtils_original + ) { + el = _Vue.extend(el.options) + } + return createElementSave(el, ...args) + } + }) +} diff --git a/test/specs/mounting-options/localVue.spec.js b/test/specs/mounting-options/localVue.spec.js index ab2b343c5..bc92cdf37 100644 --- a/test/specs/mounting-options/localVue.spec.js +++ b/test/specs/mounting-options/localVue.spec.js @@ -155,6 +155,23 @@ describeWithMountingMethods('options.localVue', mountingMethod => { }) }) + it('is applied to inline constructor functions', () => { + const ChildComponent = Vue.extend({ + render (h) { + h('p', this.$route.params) + } + }) + const TestComponent = { + render: h => h(ChildComponent) + } + const localVue = createLocalVue() + localVue.prototype.$route = {} + const wrapper = mountingMethod(TestComponent, { + localVue + }) + expect(wrapper.findAll(ChildComponent).length).to.equal(1) + }) + itRunIf( vueVersion < 2.3, 'throws an error if used with an extended component in Vue 2.3', () => { From 74aa776f0d34fcd2b44ff60cf9c5757b1240e6ec Mon Sep 17 00:00:00 2001 From: eddyerburgh Date: Sat, 27 Oct 2018 21:40:03 +0100 Subject: [PATCH 3/4] refactor: add issue URL to comment --- packages/create-instance/patch-render.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/create-instance/patch-render.js b/packages/create-instance/patch-render.js index 87479e04f..8dbfc899f 100644 --- a/packages/create-instance/patch-render.js +++ b/packages/create-instance/patch-render.js @@ -2,7 +2,7 @@ import { addHook } from './add-hook' // This is used to extend component constructors // used directly in a render function -// see # +// see github.com/vuejs/vue-test-utils/issues/995 export function patchRender (_Vue) { addHook(_Vue.options, 'beforeCreate', function () { const createElementSave = this.$createElement From 6b35c90241d813ed3bb8f75c5d941cc4dfaa4900 Mon Sep 17 00:00:00 2001 From: eddyerburgh Date: Sat, 27 Oct 2018 21:46:32 +0100 Subject: [PATCH 4/4] refactor: add correct issue URL --- packages/create-instance/patch-render.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/create-instance/patch-render.js b/packages/create-instance/patch-render.js index 8dbfc899f..e0a69ada6 100644 --- a/packages/create-instance/patch-render.js +++ b/packages/create-instance/patch-render.js @@ -2,7 +2,7 @@ import { addHook } from './add-hook' // This is used to extend component constructors // used directly in a render function -// see github.com/vuejs/vue-test-utils/issues/995 +// see https://github.com/vuejs/vue-test-utils/issues/994 export function patchRender (_Vue) { addHook(_Vue.options, 'beforeCreate', function () { const createElementSave = this.$createElement