From 44f7798770fe32633f997b4a63ac6141ca054a72 Mon Sep 17 00:00:00 2001 From: lmiller1990 Date: Sun, 15 Apr 2018 22:51:21 +0900 Subject: [PATCH 1/9] Allow mocks to be set in config object --- packages/shared/merge-options.js | 19 ++++++++++++++++++- packages/test-utils/src/config.js | 3 ++- test/specs/config.spec.js | 26 +++++++++++++++++++++++++- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/packages/shared/merge-options.js b/packages/shared/merge-options.js index d5fdb4ae1..0c94cf03b 100644 --- a/packages/shared/merge-options.js +++ b/packages/shared/merge-options.js @@ -16,12 +16,29 @@ function getStubs (optionStubs, config) { } } +function getMocks (optionMocks, config) { + if (optionMocks || + (config.mocks && Object.keys(config.mocks).length > 0)) { + if (Array.isArray(optionMocks)) { + return [ + ...optionMocks, + ...Object.keys(config.mocks || {})] + } else { + return { + ...config.mocks, + ...optionMocks + } + } + } +} + export function mergeOptions ( options: Options, config: Options ): Options { return { ...options, - stubs: getStubs(options.stubs, config) + stubs: getStubs(options.stubs, config), + mocks: getMocks(options.mocks, config) } } diff --git a/packages/test-utils/src/config.js b/packages/test-utils/src/config.js index d23364c40..2f80d5285 100644 --- a/packages/test-utils/src/config.js +++ b/packages/test-utils/src/config.js @@ -5,5 +5,6 @@ export default { stubs: { transition: TransitionStub, 'transition-group': TransitionGroupStub - } + }, + mocks: {} } diff --git a/test/specs/config.spec.js b/test/specs/config.spec.js index 2fe55057d..6b87aa5d1 100644 --- a/test/specs/config.spec.js +++ b/test/specs/config.spec.js @@ -2,7 +2,8 @@ import { mount, config, TransitionStub, - TransitionGroupStub + TransitionGroupStub, + createLocalVue } from '~vue/test-utils' describe('config', () => { @@ -33,6 +34,29 @@ describe('config', () => { expect(wrapper.contains(TransitionGroupStub)).to.equal(true) }) + it('mocks a global variable', () => { + const localVue = createLocalVue() + const t = 'real value' + localVue.prototype.$t = t + + const testComponent = { + template: ` +
{{ $t }}
+ ` + } + + config.mocks['$t'] = 'mock value' + + const wrapper = mount(testComponent, { + localVue, t + }) + + expect(wrapper.vm.$t).to.equal('mock value') + expect(wrapper.text()).to.equal('mock value') + + localVue.prototype.$t = undefined + }) + it('doesn\'t stub transition when config.stubs.transition is set to false', () => { const testComponent = { template: ` From 76730957d8ce90f113766f8361a180b7f6bb32a0 Mon Sep 17 00:00:00 2001 From: lmiller1990 Date: Sun, 15 Apr 2018 23:50:55 +0900 Subject: [PATCH 2/9] Extract setOptions method --- packages/shared/merge-options.js | 37 ++++++++++---------------------- 1 file changed, 11 insertions(+), 26 deletions(-) diff --git a/packages/shared/merge-options.js b/packages/shared/merge-options.js index 0c94cf03b..735b098ec 100644 --- a/packages/shared/merge-options.js +++ b/packages/shared/merge-options.js @@ -1,32 +1,16 @@ // @flow -function getStubs (optionStubs, config) { - if (optionStubs || - (config.stubs && Object.keys(config.stubs).length > 0)) { - if (Array.isArray(optionStubs)) { +function getOptions (key, options, config) { + if (options || + (config[key] && Object.keys(config[key]).length > 0)) { + if (Array.isArray(options)) { return [ - ...optionStubs, - ...Object.keys(config.stubs || {})] + ...options, + ...Object.keys(config[key] || {})] } else { return { - ...config.stubs, - ...optionStubs - } - } - } -} - -function getMocks (optionMocks, config) { - if (optionMocks || - (config.mocks && Object.keys(config.mocks).length > 0)) { - if (Array.isArray(optionMocks)) { - return [ - ...optionMocks, - ...Object.keys(config.mocks || {})] - } else { - return { - ...config.mocks, - ...optionMocks + ...config[key], + ...options } } } @@ -38,7 +22,8 @@ export function mergeOptions ( ): Options { return { ...options, - stubs: getStubs(options.stubs, config), - mocks: getMocks(options.mocks, config) + stubs: getOptions('stubs', options.stubs, config), + mocks: getOptions('mocks', options.mocks, config) } } + From 407b761a563b22185fff956962569cbb22beba01 Mon Sep 17 00:00:00 2001 From: lmiller1990 Date: Sun, 15 Apr 2018 23:54:21 +0900 Subject: [PATCH 3/9] Update docs --- docs/en/api/config.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/en/api/config.md b/docs/en/api/config.md index c72029a07..b47ed7f80 100644 --- a/docs/en/api/config.md +++ b/docs/en/api/config.md @@ -24,3 +24,22 @@ import VueTestUtils from '@vue/test-utils' VueTestUtils.config.stubs['my-component'] = '
' ``` + +### `mocks` + +- type: `Object` +- default: `{}` + +Like `stubs`, the values passed to `config.mocks` are used by default. Any values passed to the mounting options `mocks` object will take priority over the ones declared in `config.mocks`. + +Example: + +```js +import VueTestUtils from '@vue/test-utils' + +VueTestUtils.config.stubs['$store'] = { + state: { + id: 1 + } +} +``` From 2bb23166ab58fb4f5beb78a9f85535ee8c86cadf Mon Sep 17 00:00:00 2001 From: lmiller1990 Date: Mon, 16 Apr 2018 00:09:16 +0900 Subject: [PATCH 4/9] Update type in docs --- docs/en/api/config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/api/config.md b/docs/en/api/config.md index b47ed7f80..daf0d20a5 100644 --- a/docs/en/api/config.md +++ b/docs/en/api/config.md @@ -37,7 +37,7 @@ Example: ```js import VueTestUtils from '@vue/test-utils' -VueTestUtils.config.stubs['$store'] = { +VueTestUtils.config.mocks['$store'] = { state: { id: 1 } From 88a20f4588483f4559cc4970c7d0c9c7935eff8c Mon Sep 17 00:00:00 2001 From: lmiller1990 Date: Mon, 16 Apr 2018 20:44:48 +0900 Subject: [PATCH 5/9] Add methods to mergeOptions --- flow/options.flow.js | 1 + packages/shared/merge-options.js | 3 ++- packages/test-utils/src/config.js | 3 ++- test/specs/config.spec.js | 15 +++++++++++++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/flow/options.flow.js b/flow/options.flow.js index 2278e684e..b0ae8e99f 100644 --- a/flow/options.flow.js +++ b/flow/options.flow.js @@ -1,6 +1,7 @@ declare type Options = { // eslint-disable-line no-undef attachToDocument?: boolean, mocks?: Object, + methods?: Object, slots?: Object, scopedSlots?: Object, localVue?: Component, diff --git a/packages/shared/merge-options.js b/packages/shared/merge-options.js index 735b098ec..f02efca3c 100644 --- a/packages/shared/merge-options.js +++ b/packages/shared/merge-options.js @@ -23,7 +23,8 @@ export function mergeOptions ( return { ...options, stubs: getOptions('stubs', options.stubs, config), - mocks: getOptions('mocks', options.mocks, config) + mocks: getOptions('mocks', options.mocks, config), + methods: getOptions('methods', options.methods, config) } } diff --git a/packages/test-utils/src/config.js b/packages/test-utils/src/config.js index 2f80d5285..534f8fc6a 100644 --- a/packages/test-utils/src/config.js +++ b/packages/test-utils/src/config.js @@ -6,5 +6,6 @@ export default { transition: TransitionStub, 'transition-group': TransitionGroupStub }, - mocks: {} + mocks: {}, + methods: {} } diff --git a/test/specs/config.spec.js b/test/specs/config.spec.js index 6b87aa5d1..3aeaa6d9e 100644 --- a/test/specs/config.spec.js +++ b/test/specs/config.spec.js @@ -57,6 +57,21 @@ describe('config', () => { localVue.prototype.$t = undefined }) + it('overrides a method', () => { + const testComponent = { + template: ` +
{{ val() }}
+ ` + } + + config.methods['val'] = () => 'method' + + const wrapper = mount(testComponent) + + expect(wrapper.vm.val()).to.equal('method') + expect(wrapper.text()).to.equal('method') + }) + it('doesn\'t stub transition when config.stubs.transition is set to false', () => { const testComponent = { template: ` From 7cd229ce0bdbd97956d1e9f088578d4806286b74 Mon Sep 17 00:00:00 2001 From: lmiller1990 Date: Wed, 18 Apr 2018 21:08:29 +0900 Subject: [PATCH 6/9] Add test that local mocks override config mocks --- test/specs/mounting-options/mocks.spec.js | 40 ++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/test/specs/mounting-options/mocks.spec.js b/test/specs/mounting-options/mocks.spec.js index e34fc8c95..bcd86b235 100644 --- a/test/specs/mounting-options/mocks.spec.js +++ b/test/specs/mounting-options/mocks.spec.js @@ -1,4 +1,4 @@ -import { createLocalVue } from '~vue/test-utils' +import { createLocalVue, config } from '~vue/test-utils' import Component from '~resources/components/component.vue' import ComponentWithVuex from '~resources/components/component-with-vuex.vue' import { @@ -7,6 +7,21 @@ import { } from '~resources/utils' describeWithMountingMethods('options.mocks', (mountingMethod) => { + let configStubsSave + // let serverConfigSave + + beforeEach(() => { + configStubsSave = config.stubs + // serverConfigSave = serverConfig.stubs + config.stubs = {} + // serverConfig.stubs = {} + }) + + afterEach(() => { + config.stubs = configStubsSave + // serverConfig.stubs = serverConfigSave + }) + it('adds variables to vm when passed', () => { const TestComponent = { template: ` @@ -127,6 +142,29 @@ describeWithMountingMethods('options.mocks', (mountingMethod) => { error.restore() }) + it('prioritize mounting options over config', () => { + config.mocks['$global'] = 'globallyMockedValue' + + const localVue = createLocalVue() + const TestComponent = { + template: ` +
{{ $global }}
+ ` + } + + const wrapper = mountingMethod(TestComponent, { + localVue, + mocks: { + '$global': 'locallyMockedValue' + } + }) + const HTML = mountingMethod.name === 'renderToString' + ? wrapper + : wrapper.html() + console.log(wrapper) + expect(HTML).to.contain('locallyMockedValue') + }) + it('logs that a property cannot be overwritten if there are problems writing', () => { const error = sinon.stub(console, 'error') const localVue = createLocalVue() From 31d1f7a6817474ace65bf915a72db630f78e3922 Mon Sep 17 00:00:00 2001 From: lmiller1990 Date: Wed, 18 Apr 2018 22:41:58 +0900 Subject: [PATCH 7/9] Add test to ensure local methods override config --- test/specs/mounting-options/methods.spec.js | 29 +++++++++++++++++++++ test/specs/mounting-options/mocks.spec.js | 14 +++------- 2 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 test/specs/mounting-options/methods.spec.js diff --git a/test/specs/mounting-options/methods.spec.js b/test/specs/mounting-options/methods.spec.js new file mode 100644 index 000000000..b38410a4b --- /dev/null +++ b/test/specs/mounting-options/methods.spec.js @@ -0,0 +1,29 @@ +import { config } from '~vue/test-utils' +import { + describeWithMountingMethods +} from '~resources/utils' + +describeWithMountingMethods('options.methods', (mountingMethod) => { + it('prioritize mounting options over config', () => { + config.methods['val'] = () => 'methodFromConfig' + + const TestComponent = { + template: ` +
{{ val() }}
+ ` + } + + const wrapper = mountingMethod(TestComponent, { + methods: { + val () { + return 'methodFromOptions' + } + } + }) + const HTML = mountingMethod.name === 'renderToString' + ? wrapper + : wrapper.html() + console.log(wrapper) + expect(HTML).to.contain('methodFromOptions') + }) +}) diff --git a/test/specs/mounting-options/mocks.spec.js b/test/specs/mounting-options/mocks.spec.js index bcd86b235..31fd1a90a 100644 --- a/test/specs/mounting-options/mocks.spec.js +++ b/test/specs/mounting-options/mocks.spec.js @@ -7,19 +7,15 @@ import { } from '~resources/utils' describeWithMountingMethods('options.mocks', (mountingMethod) => { - let configStubsSave - // let serverConfigSave + let configMocksSave beforeEach(() => { - configStubsSave = config.stubs - // serverConfigSave = serverConfig.stubs - config.stubs = {} - // serverConfig.stubs = {} + configMocksSave = config.mocks + config.mocks = {} }) afterEach(() => { - config.stubs = configStubsSave - // serverConfig.stubs = serverConfigSave + config.mocks = configMocksSave }) it('adds variables to vm when passed', () => { @@ -145,7 +141,6 @@ describeWithMountingMethods('options.mocks', (mountingMethod) => { it('prioritize mounting options over config', () => { config.mocks['$global'] = 'globallyMockedValue' - const localVue = createLocalVue() const TestComponent = { template: `
{{ $global }}
@@ -153,7 +148,6 @@ describeWithMountingMethods('options.mocks', (mountingMethod) => { } const wrapper = mountingMethod(TestComponent, { - localVue, mocks: { '$global': 'locallyMockedValue' } From 7df65a78902368e4d728b9f5ad14845d56930b91 Mon Sep 17 00:00:00 2001 From: lmiller1990 Date: Wed, 18 Apr 2018 22:47:14 +0900 Subject: [PATCH 8/9] Add info about config.methods to the readme --- docs/en/api/config.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/en/api/config.md b/docs/en/api/config.md index daf0d20a5..2d73732bf 100644 --- a/docs/en/api/config.md +++ b/docs/en/api/config.md @@ -43,3 +43,20 @@ VueTestUtils.config.mocks['$store'] = { } } ``` + +### `methods` + +- type: `Object` +- default: `{}` + +You can configure default methods using the `config` object. This can be useful for plugins that inject methods to components, like [VeeValidate](https://vee-validate.logaretm.com/). You can override methods set in `config` by passing `methods` in the mounting options. + +Example: + +```js +import VueTestUtils from '@vue/test-utils' + +VueTestUtils.config.methods['errors'] = () => { + any: () => false +} +``` From 1216aff9329d98fd064d736fda0b0bd9b31e21c6 Mon Sep 17 00:00:00 2001 From: eddyerburgh Date: Wed, 18 Apr 2018 17:27:32 +0100 Subject: [PATCH 9/9] docs: fix linting errors --- docs/.eslintrc | 3 ++- docs/en/api/config.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/.eslintrc b/docs/.eslintrc index eb9c6cd87..2210a8284 100644 --- a/docs/.eslintrc +++ b/docs/.eslintrc @@ -14,6 +14,7 @@ }, "rules": { "no-unused-vars": 0, - "no-undef": 0 + "no-undef": 0, + "no-labels": 0 } } diff --git a/docs/en/api/config.md b/docs/en/api/config.md index 2d73732bf..9f7c51feb 100644 --- a/docs/en/api/config.md +++ b/docs/en/api/config.md @@ -58,5 +58,5 @@ import VueTestUtils from '@vue/test-utils' VueTestUtils.config.methods['errors'] = () => { any: () => false -} +} ```