cypress - 在我的 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
如果它只是同步的东西,比如编写输出以确保所有内容都发送到我的终端,我希望能够不必将我的任务与语句链接起来。
解决方案
如果您查看cy.task
command 的类型定义,您会看到它返回一个 Chainable(这是一个类似于 Promise 的实体)。所以它的行为就像任何其他 cy 命令(异步)。至于yield either a promise or a **value**
- 这个语句是指任务的处理程序,而不是任务本身。至于另一个命令,如果处理程序没有完成,赛普拉斯会将返回的值包装到 Promise 中。
推荐阅读
- java - 您如何获得比“错误:程序类型已存在:
“? - sql - JOIN SQL 查询失败
- css - 覆盖下的可点击链接,隐藏在悬停选择器上
- symfony - Symfony 4,如何从服务类中正确获取根路径目录(或 /src 路径)?(错误:'在 null 上调用成员函数 get()')
- git - 检索给定 Git 存储库的 URL 的最新修订 ID?
- google-apps-script - Google Sheets 脚本根据单元格的值对单元格进行条件格式设置
- r - 如何将代码应用于多个 Excel 工作簿/工作表
- vue.js - 带有url查询的vue.js路由器活动链接
- excel - Excel VBA:根据偏移值将动态范围复制到最后一行
- clock - Linux Common Clock Framework - 防止时钟被禁用