正确测试 Vue 组件中的事件处理程序

Correctly testing an event handler in Vue component

我有一个带有锚标记和关联处理程序 onSelectLink() 的组件。

<a
  :href="$t('footer.termsUrl')"
  target="_blank"
  name="termsAndConditions"
  @click="onSelectLink($event.target.name)">{{ $t('terms') }}</a>

onSelectLink() 函数...

onSelectLink (buttonName) {
      buttonName === 'termsAndConditions'
        ? this.logButtonClick(ANALYTICS.TERMS_AND_CONDITIONS)
        : this.logButtonClick(ANALYTICS.PRIVACY_POLICY)
    }

我的单元测试

describe('onSelectLink()', () => {
    it('[positive] should track analytics when user selects `Terms and Conditions` link', () => {
      const buttonName = 'termsAndConditions'
      jest.spyOn(wrapper.vm, 'onSelectLink')

      wrapper.find('a').trigger('click')
      wrapper.vm.onSelectLink(buttonName)

      expect(wrapper.vm.logButtonClick).toHaveBeenCalledWith(ANALYTICS.TERMS_AND_CONDITIONS)
    })

    it('[positive] should track analytics when user selects `Privacy Policy` link', () => {
      const buttonName = 'privacyPolicy'
      jest.spyOn(wrapper.vm, 'onSelectLink')

      wrapper.find('a').trigger('click')
      wrapper.vm.onSelectLink(buttonName)

      expect(wrapper.vm.logButtonClick).toHaveBeenCalledWith(ANALYTICS.PRIVACY_POLICY)
    })

我的问题是:

  1. 这些测试是否每个调用 onSelectLink() 两次?

  2. 我真的需要使用 "wrapper.find('a').trigger('click')"

  3. 这是 good/robust 测试以确保使用正确的参数调用 onSelectLink() 吗?

当我注释掉 "wrapper.find('a').trigger('click')" 时,测试似乎仍然通过。我以为我必须触发 DOM 事件,然后调用处理程序。

您目前在每个测试中触发了 onSelectLink 两次。

曾经

wrapper.find('a').trigger('click') // normal flow

还有一次

wrapper.vm.onSelectLink(buttonName) // you run `onSelectionLink` directly on vm

第二个原则上是错误的。您不想通过直接在 vm 上调用它来触发该方法,因为您的用户不能那样做。
他们可以做到的唯一方法是单击 link,这就是您应该测试的内容。

const logger = jest.spyOn(wrapper.vm, 'logButtonClick')
expect(logger).not.toHaveBeenCalled();
wrapper.find('a[name="termsAndConditions"]').trigger('click')
expect(logger).toHaveBeenCalledWith(ANALYTICS.TERMS_AND_CONDITIONS);

请记住,您始终可以在测试中使用 console.log(),您将在 CLI 中看到记录的值并弄清楚发生了什么。