我在一个组件中使用类的实例作为工具。该组件监视类实例中的更改。但是,我没有为该观察者编写测试。
我尝试使用jest.fn
,spyOn
和setData
,但是这些都不起作用。
该类如下:
export default class myTool {
constructor () {
this._myData = null
}
get myData () {
return this._myData
}
set myData (updatedMyData) {
this._myData = updatedMyData
}
}
以及组件:
import myTool from '@/utils/myTool'
export default {
...
data() {
return {
myTool: null
}
},
methods: {
handleMyDataUpdate(updatedMyData) {
// do something
}
},
mounted() {
this.$watch('myTool.myData', (updatedMyData) => {
this.handleMyDataUpdate(updatedMyData)
})
this.myTool = new myTool()
}
...
}
jest.fn
:测试:
it('should call handleMyDataUpdate on myData update.', () => {
const wrapper = mountComponent()
const handleMyDataUpdate = jest.fn()
wrapper.setMethods({ handleMyDataUpdate })
wrapper.vm.myTool.myData = 5
expect(handleMyDataUpdate).toBeCalled()
})
spyOn
:测试:
it('should call handleMyDataUpdate on myData update.', () => {
const wrapper = mountComponent()
const spy = jest.spyOn(wrapper.vm, 'handleMyDataUpdate')
wrapper.vm.myTool.myData = 5
expect(spy).toBeCalled();
}
setData
:测试:
it('should call handleMyDataUpdate on myData update.', () => {
const wrapper = mountComponent()
const handleMyDataUpdate = jest.fn()
wrapper.setMethods({ handleMyDataUpdate })
wrapper.setData({
myTool: {
myData: 5
}
})
expect(handleMyDataUpdate).toBeCalled()
}
结果:我尝试的3件事始终失败,原因如下:Expected mock function to have been called.
,是否评论myData
更新的行。
我尝试将expect
行包装在$nextTick
内,但是它也不起作用:
wrapper.vm.$nextTick(() => {
// expectation
done()
})
以下错误输出,并且测试始终被视为“通过”,而测试应为“失败”:
console.error node_modules/vue/dist/vue.runtime.common.js:1739
{ Error: expect(jest.fn()).toBeCalled()
查看vue.runtime.common.js
的1739行没有帮助。
那我该如何测试我的观察者?
答案 0 :(得分:1)
问题是您在_myData
类中的myTool
最初是undefined
,所以它没有反应。要解决此问题,请在_myData
的构造函数中初始化myTool
:
class myTool {
constructor() {
this._myData = null
}
// ...
}
然后,您的“第一次尝试”测试应成功通过。