首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Jest和vue-utils测试Vue组件

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

Stack Overflow用户
提问于 2018-11-17 00:17:37
回答 2查看 815关注 0票数 2

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

代码语言:javascript
复制
expect(jest.fn()).toHaveBeenCalled()

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

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

代码语言:javascript
复制
       <div>
          <a-button
            type="primary"
            @click="generatePhone"
            size="large"
            class="btn-generate"
          >Generate Phone Numbers</a-button>
        </div>

我所做的事情如下

代码语言:javascript
复制
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()
  })

有没有人可以分享更多关于这方面的信息,以及我做错了什么。

EN

回答 2

Stack Overflow用户

发布于 2018-11-17 00:29:50

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

我有两个猜测:

  1. 您应该通过methods

提供模拟函数

像这样:

代码语言:javascript
复制
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 mock时遇到了问题。

  1. 最重要的是,你可能需要等待电话,

作为:

代码语言:javascript
复制
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的内部结构。

票数 0
EN

Stack Overflow用户

发布于 2018-11-21 19:50:37

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

我是如何解决它的

代码语言:javascript
复制
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,你可以像这样传递它:

代码语言:javascript
复制
generatePhone(params)
const button = wrapper.find('.btn-generate')
button.trigger('click')
expect(generatePhone).toBeCalledWith(params)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53341710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档