我有一个这样的Vue页面:
<template>
</template>
<script>
created(){
this.doSomething();
}
methods: {
doSomething() {
.....
}
}
</script>
现在,我们要测试此已创建的钩子,并检查是否已调用doSomething()方法。
这样尝试过,玩笑也被导入package.json
import {
shallowMount,
createLocalVue,
} from '@vue/test-utils';
const localVue = createLocalVue();
import Xyx from '/Xyx.vue';
const init = () => {
wrapper = shallowMount(Xyx, { localVue });
cmp = wrapper.vm;
};
describe('#created', () => {
it('#doSomething', () => {
init();
wrapper.setMethods({
doSomething: jest.fn(),
})
expect(cmp.doSomething).toHaveBeenCalled();
});
});
我可以做这个创建的钩子的单元测试用例吗?
答案 0 :(得分:1)
{
"name": "client",
"version": "0.1.0",
"private": true,
"proxy": "http://localhost:3001",
"dependencies": {
...
},
"scripts": {
"start": "node server.js",
"dev-start": "react-scripts start",
"build": "GENERATE_SOURCEMAP=false react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"gen": "graphql-codegen --config codegen.yml"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"devDependencies": {
...
}
}
的v1中已弃用methods
选项,因此接受的答案不再起作用。我本人遇到了这个问题,并决定深入研究源代码以弄清楚如何进行测试。
看起来Vue实际上将所有钩子存储在@vue/test-utils
属性中。每个挂钩都有一个选项,该选项是一个函数数组。重要的是要注意,上下文未绑定到上述功能,因此您将需要使用$options
或call
来执行它们。
apply
答案 1 :(得分:0)
由于您的方法是在created
上调用的,因此在您设置模拟之前,该方法已运行。因此,您的测试将失败。
您必须在初始化时用模拟代替方法(在您的情况下,在shallowMount
上):
describe('Xyz', () => {
it('should call doSomething() when created', () => {
const doSomething = jest.fn()
wrapper = shallowMount(Xyz, {
localvue,
methods: { doSomething }
});
expect(wrapper.vm.doSomething).toHaveBeenCalled();
});
});
旁注:您不是在声明cmp
。在测试开始时,您应该有一个let cmp;
非常类似的讨论here。在链接的注释上方,有一种方法可以模拟大多数Vue组件生命周期挂钩的属性。
答案 2 :(得分:0)
在测试中需要时可以调用钩子。例如,如果我们需要在调用钩子之前模拟一些数据。
import App from '@/App.vue';
// in test
App.created.call(wrapper.vm);
在Typescript中,如果我们使用vue-property-decorator,它也会更改组件的形状,因此需要这样做:
App.extendOptions.created.call(wrapper.vm)