0

我无法确定如何对 Vue 组件进行简单测试(使用赛普拉斯组件测试运行程序)以查看按钮单击是否导致事件被发出

// MyButton.vue component
    <template>
      <Button
        data-testid="button"
        label="Click Button"
        @click="clickButton()"
      />
    </template>
    <script setup lang="ts">
    import { defineEmits } from "vue";
    const emit = defineEmits(["clickButtonEvent"]);
    
    function clickButton() {
      emit("clickButtonEvent");
    }
    </script>
// MyButton.spec.ts
    it.only("should emit an even when clicked", () => {
      const clickButtonSpy = cy.spy().as("clickButtonEvent");
    
      mount(FulfilButton, {
        global: {
          components: {
            Button,
          },
        },
      })
      .get('[data-testid="button"]')
      .click();
    
      cy.get("@clickButtonEvent").should("have.been.called");
    });

这不起作用 - 在我看到的控制台中

mount
get
-click

但然后这个:

expect clickButtonEvent to have been called at least once, but it was never called

所以我想我没有cy.spy正确连接这个 - 大概是因为我没有将它作为安装的一部分?我需要做什么?按钮本身是 PrimeVue 按钮组件,但我很确定这不会阻止我进行此测试?

4

1 回答 1

1

好吧,你根本没有勾引间谍。

赛普拉斯mount命令具有相同的界面vue-test-utils mount(它vue-test-utils在引擎盖下使用)

vue-test-utilsv1(对于 Vue 2)中,您可以使用listeners mount 选项来附加间谍,如本答案所示

但是,由于您使用的是 Vue 3,然后是vue-test-utils v2,其中listenersmount 选项已被删除,因此可能是您使用推荐的包装器 API 的最佳选择 -发射

这个例子取自Jessica Sachs (赛普拉斯团队成员)(repo )最近的谈话,她做了这样的事情:

mount(FulfilButton, {
  global: {
    components: {
      Button,
    },
  },
})
.get('[data-testid="button"]')
.click()
.vue()
.then((wrapper) => {
  expect(wrapper.emitted('clickButtonEvent')).to.have.length(1)
})

请注意,这vue()不是内置的赛普拉斯命令。在这个演示/存储库中,它是由 Jessica 在支持文件中添加的

// ./cypress/support/index.js

Cypress.Commands.add('vue', () => {
  return cy.wrap(Cypress.vueWrapper)
})

您可以在不引入任何帮助器的情况下做一些非常相似的事情(示例

it('emits "increment" event on click', () => {
    cy.get('button')
    .click()
    .click()
    .then(() => {
      cy.wrap(Cypress.vueWrapper.emitted()).should('have.property', 'increment')
    })
  })
于 2021-12-03T11:58:12.053 回答