【发布时间】:2017-10-08 17:55:44
【问题描述】:
我在我的全局 app.js 中声明了一个事件总线,如下所示:
window.Event = new Vue();
组件看起来像
export default {
data() {
return {
hasError: false,
zip: '',
};
},
methods: {
setZip: function() {
this.hasError = false;
this.$emit('setZip', this.zip);
},
},
mounted() {
Event.$on('showErrors', (errors) => {
this.hasError = errors.zip ? true : false;
});
this.zip = this.editZip;
},
props: [
'editZip'
],
}
我使用ava 对我的组件进行单元测试,并使用以下helpers/setup.js:
const browserEnv = require('browser-env');
const hook = require('vue-node');
const { join } = require('path');
// Setup a fake browser environment
browserEnv();
// Pass an absolute path to your webpack configuration to the hook function.
hook(join(__dirname, './webpack.config.js'));
webpack.config.js 看起来像:
module.exports = {
module: {
loaders: [
{
test: /\.vue$/,
loader: 'vue-loader',
},
{
test: /\.js$/,
loader: 'babel',
exclude: /node_modules/,
},
],
},
resolve: {
extensions: ['.js', '.vue'],
},
};
运行以下测试时
import Vue from 'vue/dist/vue.js';
import test from 'ava';
import Zip from '../../resources/assets/js/components/Company/Zip.vue';
let vm;
test.beforeEach(t => {
let Z = Vue.extend(Zip);
vm = new Z({ propsData: {
editZip: 1220
}}).$mount();
});
test('that it renders a div with class form-group', t => {
t.is(vm.$el.className, 'form-group');
});
它通过了,但抛出以下错误:
[Vue warn]: Error in mounted hook: "TypeError: Event.$on is not a function"
(found in <Root>)
TypeError: Event.$on is not a function
at VueComponent.mounted (/mnt/c/code/leaflets/resources/assets/js/components/Company/City.vue:107:15)
at callHook (/mnt/c/code/leaflets/node_modules/vue/dist/vue.js:2530:21)
at mountComponent (/mnt/c/code/leaflets/node_modules/vue/dist/vue.js:2424:5)
at VueComponent.Vue$3.$mount (/mnt/c/code/leaflets/node_modules/vue/dist/vue.js:7512:10)
at VueComponent.Vue$3.$mount (/mnt/c/code/leaflets/node_modules/vue/dist/vue.js:9592:16)
at Test._ava2.default.beforeEach.t [as fn] (/mnt/c/code/leaflets/tests/js/CompanyCity.js:12:9)
at Test.callFn (/mnt/c/code/leaflets/node_modules/ava/lib/test.js:281:18)
at Test.run (/mnt/c/code/leaflets/node_modules/ava/lib/test.js:294:23)
at runNext (/mnt/c/code/leaflets/node_modules/ava/lib/sequence.js:58:44)
at Sequence.run (/mnt/c/code/leaflets/node_modules/ava/lib/sequence.js:90:10)
at Concurrent.run (/mnt/c/code/leaflets/node_modules/ava/lib/concurrent.js:41:37)
at runNext (/mnt/c/code/leaflets/node_modules/ava/lib/sequence.js:58:44)
at Sequence.run (/mnt/c/code/leaflets/node_modules/ava/lib/sequence.js:90:10)
at runNext (/mnt/c/code/leaflets/node_modules/ava/lib/sequence.js:58:44)
at Sequence.run (/mnt/c/code/leaflets/node_modules/ava/lib/sequence.js:90:10)
at Bluebird.try (/mnt/c/code/leaflets/node_modules/ava/lib/runner.js:214:48)
at tryCatcher (/mnt/c/code/leaflets/node_modules/bluebird/js/release/util.js:16:23)
at Function.Promise.attempt.Promise.try (/mnt/c/code/leaflets/node_modules/bluebird/js/release/method.js:39:29)
at Runner.run (/mnt/c/code/leaflets/node_modules/ava/lib/runner.js:214:22)
at process.on.options (/mnt/c/code/leaflets/node_modules/ava/lib/main.js:82:10)
at emitOne (events.js:96:13)
at process.emit (events.js:191:7)
at process.on.message (/mnt/c/code/leaflets/node_modules/ava/lib/process-adapter.js:14:10)
at emitTwo (events.js:106:13)
at process.emit (events.js:194:7)
at process.nextTick (internal/child_process.js:766:12)
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickCallback (internal/process/next_tick.js:104:9)
我不知道在我的测试中在哪里声明window.Event = new Vue(),以便被测试的组件可以访问Event 变量。
【问题讨论】:
-
不确定,但您不会错过测试模块中事件变量的导入吗?也许看看这个:alligator.io/vuejs/global-event-bus
-
不要依赖全局属性,看看是否可以像 vue-router 那样将其添加为 instance property。
标签: javascript unit-testing vue.js ava