测试驱动开发Vuejs(三)设置Data和断言样式
十月初 Vuejs官方团队发布了测试套件 vue-test-utils github 地址 / 官方网站 本文主要是参考官方的指南 和一个国外的视频教程 第三节
watch test
现在我们的测试,每次修改都需要手动运行 npm test 。我们可以像开发那样,watch 测试文件的变化,自动刷新测试结果。
增加 npm scripts
{
// package.json
// ...
"scripts": {
"test": "mocha-webpack --webpack-config webpack.config.js --require test/setup.js test/*.spec.js",
"watch": "mocha-webpack --webpack-config webpack.config.js --watch --require test/setup.js test/*.spec.js"
}
// ...
}
运行 npm run watch
之后,可以看到,每次修改counter.spec.js 都会刷新测试结果
增加 “减法”
我们的组件只有”加” ,现在增加”减”
//counter.spec.js
// ...
it ('increments the count when the button is click', () => {
expect(wrapper.vm.count).toBe(0);
wrapper.find('.increase').trigger('click');
expect(wrapper.vm.count).toBe(1);
})
it ('decrements the count when the button is click', () => {
expect(wrapper.vm.count).toBe(0);
wrapper.find('.increase').trigger('click');
expect(wrapper.vm.count).toBe(1);
wrapper.find('.decrease').trigger('click');
expect(wrapper.vm.count).toBe(0);
})
// ...
// Counter.vue
<template>
<div>
<button class="decrease" @click="count > 0 ? count-- : 0">-</button>
<span class="count">8</span>
<button class="increase" @click="count++">+</button>
</div>
</template>
// ...
四个测试都通过了,随着测试的增加,每次都将所有的测试跑一遍,显然是费力的。 因为我们只想执行正在关注的这一条测试。 使用mocha only就可以了。 不过在提交git的时候,记得要移除 only。
//counter.spec.js
// ...
it.only('decrements the count when the button is click', () => {
expect(wrapper.vm.count).toBe(0);
wrapper.find('.increase').trigger('click');
expect(wrapper.vm.count).toBe(1);
wrapper.find('.decrease').trigger('click');
expect(wrapper.vm.count).toBe(0);
})
// ...
现在只会测试这一条了。
设置data
为了测试减法 我们先进行了加法。如果要测试的状态很复杂,这显然是费时费力的。所以我们可以直接设置data
vue-test-utils 提供了 setData 方法
//counter.spec.js
// ...
it.only('decrements the count when the button is click', () => {
wrapper.setData({count: 5})
wrapper.find('.decrease').trigger('click');
expect(wrapper.vm.count).toBe(4);
})
// ...
顺利通过测试
对 style 进行断言
现在我们增加一点交互效果,只有count 大于0 的时候 才显示 减号按钮。
使用 vue 的 v-show 指令 和 vue-test-utils 的 hasStyle
增加一条测试
//counter.spec.js
// ...
it('decrements the count when the button is click', () => {
wrapper.setData({count: 5})
wrapper.find('.decrease').trigger('click');
expect(wrapper.vm.count).toBe(4);
})
it.only('never gose below 0 ', () => {
expect(wrapper.vm.count).toBe(0);
expect(wrapper.find('.decrease').hasStyle('display', 'none')).toBe(true)
wrapper.find('.increase').trigger('click');
expect(wrapper.vm.count).toBe(1);
expect(wrapper.find('.decrease').hasStyle('display', 'none')).toBe(false)
})
// ...
// Counter.vue
<template>
<div>
<button class="decrease" @click="count > 0 ? count-- : 0" v-show="count">-</button>
<span class="count">8</span>
<button class="increase" @click="count++">+</button>
</div>
</template>
此外 vue-test-utils 还提供了 is setProps setMethods hasClass hasAttribute 等众多方法
原教程地址
Written on October 20, 2017