javascript - 如何使用 Mocha 测试 Vue.js 中的 DOM 更新?
问题描述
我正在努力理解使用 Karma、Mocha 和 Chai 在 Vue.js 中进行单元测试的一些基本概念。
这是我的组件:
VueExample.vue
<template>
<div>
<p>{{ name }}</p>
<input v-model="name">
</div>
</template>
<script>
export default {
name: 'VueExample',
data () {
return {
name: 'Bruce Lee'
};
}
}
</script>
这就是我试图测试它的方式:
VueExample.spec.js
import Vue from 'vue';
import VueExample from "../../../components/VueExample";
describe('VueExample.vue', () => {
let vm;
beforeEach(() => {
const Constructor = Vue.extend(VueExample);
vm = new Constructor().$mount();
});
it('should change the name', done => {
const input = vm.$el.querySelector('input');
input.value = 'Chuck Norris';
expect(vm.$el.querySelector('p').textContent).to.equal('Bruce Lee');
Vue.nextTick(() =>{
expect(vm.$el.querySelector('p').textContent).to.equal('Chuck Norris');
console.log(vm.$el.querySelector('p').textContent);
done();
});
});
});
我使用 Karma 运行测试并使用 Chai 作为断言库。一切都在karma.conf.js
. 当我运行这个测试时,它失败了。标签内的文本<p>
不会改变。该console.log
命令输出李小龙。
测试使用 Firefox 运行。
解决方案
v-model
依赖于输入事件,它不会通过简单地在 JavaScript 中编辑输入值来发生。在 Vue 之外也是如此,如下所示:
function logInput(e) {
console.log('input', e.target.value)
}
function update() {
const input = document.querySelector('#input1')
input.value = "foo"
}
<input oninput="logInput(event)" id="input1">
<button onclick="update()">Update textbox</button>
<div>Clicking button changes text but does not emit <code>input</code> event. See console.</div>
在您的测试中手动分派输入事件应该可以工作。在您的示例中,input.dispatchEvent(new Event('input'))
设置后执行input.value
:
const input = vm.$el.querySelector('input');
input.value = 'Chuck Norris';
input.dispatchEvent(new Event('input')); // input event required to update v-model
推荐阅读
- sql - 仅当所有状态与返回结果相同时
- javascript - 多个数据字段的 jQuery DataTables 列定义
- c# - 如何通过重新开始或进入特定步骤来控制 Microsoft Bot Framework 对话框以重复对话框序列?
- react-native - react-native -bash:react-native:找不到命令
- typescript - rxjs 和 typescript 返回一个没有参数的函数
- abp - 显示隐藏菜单 MVC jQuery
- java - 如何使用 POI 库从 Excel 中读取过滤后的行
- sql-server - 当asp.net core web api中的表记录发生变化时从数据库获取通知的最佳方法
- javascript - 未在 php 标头脚本中传递的 Javascript 变量
- html - 如何仅在 flex 中使用 CSS 等分空 div?