【问题标题】:How do I test a watcher on a tool that was imported in my component?如何在我的组件中导入的工具上测试观察者?
【发布时间】:2019-05-23 17:24:35
【问题描述】:

我在我的一个组件中使用一个类的实例作为工具。该组件监视类实例的变化。但是,我无法为该观察者编写测试。

我尝试使用jest.fnspyOnsetData,但这些都不起作用。

类如下所示:

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 行没有帮助。

那么我该如何测试我的观察者呢?

【问题讨论】:

    标签: vue.js jestjs vue-test-utils


    【解决方案1】:

    问题是您在myTool 类中的_myData 最初是undefined,所以它不是反应性的。要解决此问题,请在myTool 的构造函数中初始化_myData

    class myTool {
      constructor() {
        this._myData = null
      }
      // ...
    }
    

    那么,您的“第一次尝试”测试应该会成功通过。

    demo

    【讨论】:

    • 嗯,这是一个有趣的答案,但我确实在我的真实代码中为_myData 分配了一个值。我给出的例子有点过于简化了。我将在问题中添加此分配。
    • 嗯。您可以编辑代码框以匹配您的确切用例吗?这将有助于解决问题。
    • 这是一个更接近真实代码的示例:codesandbox.io/s/knk5xn8l3
    • 我成功了!在我的原始代码中,我在设置观察者后实例化了一个 myTool,这与您的 codepen 不同......并且与原始问题代码不同(我感到羞耻)。然而它是被动的,因为我可以在观察者函数中记录内容并在控制台中查看结果......不知道发生了什么......但现在我的测试似乎工作正常。
    • 我需要在观察者之后创建工具实例,因为观察者应该查看构造函数中所做的更改。如果我在观察者之前实例化工具,则构造函数中包含的整套指令将在观察者设置之前执行。因此,不会调用观察者回调。我的结论是,要么 Jest 和 Vue-test-utils 不够强大,无法在我的情况下使用,要么是我的代码设计不当。
    猜你喜欢
    • 1970-01-01
    • 2018-01-08
    • 2018-03-02
    • 2020-04-05
    • 2021-06-24
    • 2020-02-17
    • 1970-01-01
    • 2020-07-25
    • 2020-05-28
    相关资源
    最近更新 更多