【问题标题】:Test Vue components using Jest and vue-utils使用 Jest 和 vue-utils 测试 Vue 组件
【发布时间】:2019-04-19 20:52:09
【问题描述】:

我正在尝试使用 jest 和 vue-utils 测试在 vue 中调用的组件,但它给出了以下错误

expect(jest.fn()).toHaveBeenCalled()

 Expected mock function to have been called, but it was not called.

RandomPhoneNumber component该组件使用了ant-design-vue UI

       <div>
          <a-button
            type="primary"
            @click="generatePhone"
            size="large"
            class="btn-generate"
          >Generate Phone Numbers</a-button>
        </div>

我所做的如下

it('should call generatePhone', () => {
    const wrapper = mount(RandomPhoneNumber, {
      localVue,
      sync: false
    })

    const spy = jest.fn()
    wrapper.vm.generatePhone = spy
    const button = wrapper.find('.btn-generate')
    button.trigger('click')
    expect(wrapper.vm.generatePhone).toHaveBeenCalled()
  })

任何人都可以分享更多关于这一点的信息以及我在这里做错了什么。

【问题讨论】:

    标签: vue.js jestjs vue-component


    【解决方案1】:

    所以经过一系列的调试并尝试看看什么有效。 看起来调用 wrapper.vm.method 没有更新。我所做的是调用generatePhone(),而不用前缀wrapper.vm。我不知道为什么前缀 wrapper.vm 拒绝工作。如果有人知道为什么我认为这将非常有帮助。

    我是怎么解决的

    cost generatePhone = jest.fn();
    const wrapper = mount(RandomPhoneNumber, {
      localVue,
      sync: false
    })
    
    generatePhone()
    const button = wrapper.find('.btn-generate')
    button.trigger('click')
    expect(generatePhone).toHaveBeenCalled()
    

    如果你想传递一个参数给generatePhone,你可以像这样传递它:

    generatePhone(params)
    const button = wrapper.find('.btn-generate')
    button.trigger('click')
    expect(generatePhone).toBeCalledWith(params)
    

    【讨论】:

      【解决方案2】:

      如果没有您的组件代码,很难发现这一点。您的测试代码看起来还不错,但是我之前从未使用过sync: true 选项。

      我有两个猜测:

      1. 您应该通过methods 提供模拟功能,

      喜欢:

      cost generatePhone = jest.fn();
      const wrapper = mount(RandomPhoneNumber, {
        localVue,
        sync: false,
        methods: {
          generatePhone,
        }
      })
      
      const spy = jest.fn()
      wrapper.vm.generatePhone = spy
      const button = wrapper.find('.btn-generate')
      button.trigger('click')
      expect(generatePhone).toHaveBeenCalled()
      

      注意我对generatePhone 的期望,而不是通过wrapper.vm 访问它。我不知道为什么会发生这种情况,但是在通过包装器访问时,我遇到了针对玩笑的问题,

      1. 除此之外,您可能需要等待电话,

      作为:

      const generatePhone = jest.fn();
      const wrapper = mount(RandomPhoneNumber, {
        localVue,
        sync: false,
        methods: {
          generatePhone,
        }
      })
      
      const spy = jest.fn()
      wrapper.vm.generatePhone = spy
      const button = wrapper.find('.btn-generate')
      button.trigger('click')
      await Promise.resolve()
      expect(generatePhone).toHaveBeenCalled()
      done() // this have to be passed as the 'it' function handler as a parameter: https://jestjs.io/docs/en/asynchronous.html
      

      我不太确定第二个,但是由于您将 sync 传递为 false,您可能需要等待下一个滴答声才能调用该方法,我真的不知道,因为这个取决于 Vue 内部。

      【讨论】:

      • 我已经添加了组件。我按照你上面说的做了,但没有测试方法。
      猜你喜欢
      • 2019-07-16
      • 2018-08-06
      • 2019-05-28
      • 2020-12-01
      • 2019-10-24
      • 2019-03-11
      • 2021-06-22
      • 2020-02-13
      • 2019-09-26
      相关资源
      最近更新 更多