【发布时间】:2017-08-20 23:08:39
【问题描述】:
我为描述我的问题所做的基本设置:
使用 vue-cli 2.8.2,我生成了一个基于 webpack 模板 (vue init webpack vue-test-sinon-spy) 的新项目,保留了 vue-cli 的所有默认值(除了禁用 eslint 无关)。
在这个 vue-cli 生成的项目中所做的更改:
- 我在 Hello.vue 的 h2 标签上附加了一个事件:
<h2 @click="sayHello">Essential Links</h2>
- 我在 Hello 组件中添加了一个方法
<script>
export default {
...
methods: {
sayHello() {
console.log('hello!')
}
}
}
</script>
- 我在 Hello.spec.js 中添加了一个新测试
describe('Hello.vue', () => {
// ...
it('should handle click on h2 tag', () => {
const Constructor = Vue.extend(Hello)
const vm = new Constructor().$mount()
sinon.spy(vm, 'sayHello')
// [A] if I run the line below, vm.sayHello.callCount will be 0 - not as expected
vm.$el.querySelector('h2').click()
// [B] if I run the line below, vm.sayHello.callCount will be 1 - as expected
// vm.sayHello()
// vm.sayHello.callCount will be 0 or 1, depending on
// what line I execute ([A] or [B]),
// even if in both cases sayHello method is really executed
console.log('###', vm.sayHello.callCount)
})
})
当我以编程方式单击 html 标记(使用 vm.$el.querySelector('h2').click())时,spy 不会捕获方法 sayHello 的执行,因此 vm.sayHello.callCount 将为 0。不是我喜欢的。
但是,如果我直接调用sayHello(使用vm.sayHello()),vm.sayHello.callCount 将是 1。正如我所料。
如果我想模拟对 html 标签 (vm.$el.querySelector('h2').click()) 的点击,而不是直接调用 sayHello (没有vm.sayHello())?
谢谢
【问题讨论】:
-
这不是更好的 e2e 测试吗?我不认为单元测试应该关注 UI 交互