【发布时间】:2018-09-01 01:44:16
【问题描述】:
假设我有以下组件:
import { mapState } from 'vuex';
import externalDependency from '...';
export default {
name: 'Foo',
computed: {
...mapState(['bar'])
},
watch: {
bar () {
externalDependency.doThing(this.bar);
}
}
}
在测试时,我想确保externalDependency.doThing() 被bar(来自vuex 状态)调用,如下所示:
it('should call externalDependency.doThing with bar', () => {
const wrapper = mount(Foo);
const spy = jest.spyOn(externalDependency, 'doThing');
wrapper.setComputed({bar: 'baz'});
expect(spy).toHaveBeenCalledWith('baz');
});
Vue test-utils 有一个 setComputed 方法,可以让我当前测试它,但我不断收到警告说 setComputed 将很快被删除,我不知道还有什么方法可以测试它:
【问题讨论】:
-
如果你提交了对 Vuex 的更改,计算的属性将通过 Vue 更新。我不知道手表是否会触发,但是设置 Vuex 状态而不是直接更改计算似乎应该可以工作。
-
但这与单元测试的精神背道而驰——它更像是一个 e2e 测试。您不必在测试 VueX 连接组件时模拟 vueX 功能
-
鉴于 Vuex 的
mapState是您组件的输入,这就是您应该模拟的内容。使用setComputed无法正确测试您的应用 -
导入/模拟 VueX 商店进行单元测试没有任何问题。通常你会在
beforeEach()中模拟它们,所以你的it()块很精简。随着组件的增长,您可能会执行dispatch并可能观察状态本身,因此为每个测试更改/设置这些属性会变得非常尴尬。
标签: javascript vue.js vuex vue-test-utils