首页 > 解决方案 > 在我的 Cypress.io 测试中,为什么我需要将 cy.task 视为异步的而不是异步的

问题描述

我有Cypress.io测试,它们使用简单的Cypress 任务将一些表信息记录到终端。例如我有一个这样的测试:

it("Writes some console logs and checks a val", () => {
  cy.task("rowLog", { id: 1, name: "foo", type: "bar" });
  let one = 1;
  expect(one).to.equal(2);
});

而任务“rowLog”就像这样:

module.exports = (on, config) => {
  on("task", {
  rowLog(data) {
    // use node.js console.table to pretty print table data:
    console.table(data);
    return null;
  },
}

但是rowLog如果我通过无头运行赛普拉斯,结果将不会显示在我的终端中Cypress run。这是因为测试会失败。如果我们切换测试以使其通过,那么它将显示。

但是我刚刚意识到,如果我rowLog像下面这样对待它是异步的。它将结果打印到终端:

it("Writes some console logs and checks a val", () => {
  // add a .then to task:
  cy.task("rowLog", { id: 1, name: "foo", type: "bar" }).then(() => {
    let one = 1;
    expect(one).to.equal(2);
  });
});

这不是我对文档的期望。他们说:

cy.task() 产生由 pluginsFile 中的任务事件返回或解析的值。(来源

并且一个任务可以产生一个承诺或一个价值

我是赛普拉斯的新手——我有什么遗漏或做错了吗?.then如果它只是同步的东西,比如编写输出以确保所有内容都发送到我的终端,我希望能够不必将我的任务与语句链接起来。

标签: cypress

解决方案


如果您查看cy.taskcommand 的类型定义,您会看到它返回一个 Chainable(这是一个类似于 Promise 的实体)。所以它的行为就像任何其他 cy 命令(异步)。至于yield either a promise or a **value**- 这个语句是指任务的处理程序,而不是任务本身。至于另一个命令,如果处理程序没有完成,赛普拉斯会将返回的值包装到 Promise 中。


推荐阅读