vue.js - 使用 Jest 和 vue-utils 测试 Vue 组件

标签 vue.js jestjs vue-component

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

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

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

RandomPhoneNumber 组件 该组件使用了 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()
  })

谁能分享更多关于这方面的信息以及我在这里做错了什么。

最佳答案

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

我有两个猜测:

  1. 您应该通过方法提供模拟函数,

喜欢:

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 访问它。我不知道为什么会发生这种情况,但在通过包装器访问时,我在针对 jest mocks 断言时遇到了问题,

  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 内部结构。

关于vue.js - 使用 Jest 和 vue-utils 测试 Vue 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53341710/

相关文章:

javascript - 如何在 Vue 组件上包含 &lt;script&gt; 标签

javascript - Vue.js eslint 解析错误。 : unexpected token

javascript - 没有 enzyme 如何测试 child 成分法?

javascript - VS Code 调试器中的 Jest + Babel 导致断点移动

javascript - Vue2 : data updated but html not?

vue.js - 如何在 vue 中使用 grpc-web?

javascript - Parent onChange 将子属性设置为 true

javascript - 开 Jest : Compare DOM element with JavaScript Object

javascript - 如何更改 vue-google-maps 中的标记图标

javascript - Vue.js 2.x 选择内部组件未获取值