如何测试单个文件Vue组件

时间:2017-04-28 11:11:57

标签: javascript testing vue.js ava

我想使用ava对我的Vue组件进行单元测试。现在我有一个非常简单的设置:

的package.json

{
    "name": "vue-testing",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "babel": {
        "presets": [
            "es2015"
        ]
    },
    "ava": {
        "require": [
            "babel-register",
            "./test/helpers/setup-browser-env.js"
        ]
    },
    "devDependencies": {
        "ava": "^0.18.1",
        "babel-preset-es2015": "^6.24.1",
        "babel-register": "^6.22.0",
        "browser-env": "^2.0.21"
    },
    "dependencies": {
        "vue": "^2.1.10"
    }
}

./测试/助手/设置浏览器-env.js

import browserEnv from 'browser-env';

browserEnv();

./测试/ Notification.js

import Vue from 'vue/dist/vue.js';
import test from 'ava';
import Notification from '../src/Notification';

let vm;

test.beforeEach(t => {
    let N = Vue.extend(Notification);

    vm = new N({ propsData: {
        message: 'Foobar'
    }}).$mount();
});


test('that it renders a notification', t => {
    t.is(vm.$el.textContent, 'FOOBAR');
});

的src / Notification.js

export default {
    template: '<div><h1>{{ notification }}</h1></div>',
    props: ['message'],
    computed: {
        notification() {
            return this.message.toUpperCase();
        }
    }
};

当我运行ava时,一切都按预期工作:1 passed

如果我可以使用以下组件语法,我会更高兴:

./ SRC / Notification.vue

<template>
    <div>
        <h1>{{ notification }}</h1>
    </div>
</template>
<script>
export default {
     props: ['message'],

    computed: {
        notification() {
            return this.message.toUpperCase();
        }
    }
}
</script>

但是ava将返回以下错误:

> 1 | <template>
    | ^
  2 |     <div>
  3 |         <h1>{{ notification }}</h1>
  4 |     </div>

我无法弄清楚如何使这项工作,任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

<强>问题

在运行之前,您需要将.vue文件编译成JavaScript。

<强>解决方案

您可以根据需要使用vue-node在模块上运行vue-loader。

运行npm install --save-dev vue-node,将vue-node添加到项目中

在/ helpers目录中,创建一个setup.js文件

添加以下内容:

const hook = require('vue-node');
const { join } = require('path');

// Pass an absolute path to your webpack configuration to the hook function.
hook(join(__dirname, './path/to/webpack.config.js'));

其中./path/to/webpack.config.js是使用vue-loader的webpack配置的路径,相对于您的项目。

在package.json中,添加

"ava": {
  "require": [
    "./test/helpers/setup.js"
  ]
},

作为财产。

您可以在此处查看有效的示例回复 - https://github.com/eddyerburgh/avoriaz-ava-example

<强>替代

This thread展示了一些使用ava进行测试的方法。

答案 1 :(得分:0)

你快到了:

<template>
    <div>
        <h1>{{ notification }}</h1>
    </div>
</template>
<script>
  export default {
     props: ['message'],

    computed: {
        notification() {
            return this.message.toUpperCase();
        }
    }
}
</script>

我所做的是,在开始新文件时,我通常会使用此模板

<template>
</template>

<script>
  export default {
  }
</script>

<style>
</style>

然后我开始编写代码

这里有更多信息:https://vuejs.org/v2/guide/single-file-components.html

答案 2 :(得分:0)

您可以尝试使用汽油https://github.com/MGMonge/petrol

并做类似的事情

import Notification from "../src/Notification.vue";
import VueTestCase from "petrol/core/VueTestCase.js";

export default class NotificationTest extends VueTestCase {
    beforeEach() {
        this.SUT = this.mount(Notification, {message: 'soMe MeSSagE'});
    }

    /** @test */
    it_converts_message_to_upper_case() {
        this.assertEquals('SOME MESSAGE', this.SUT.notification);
    }
}