如何让 Cypress 在已解决的任务承诺内等待超时?

问题描述 投票:0回答:1

我有一个赛普拉斯测试,如下所示:

it('redirects from ID to slug', () => {
  cy.setupEnvironment(params).then((environment) => {
    cy.visit(`/?id=${environment.id}`);

    cy.location("pathname", { timeout: 10_000 }).should(
      "eq",
      `/${environment.slug}`
    );
  });
});

setupEnvironment
是一个自定义命令,它包装了用于设置数据库等的
cy.task
调用。

// the task
async function setupEnvironmentTask(params) {
  await setUpDb();
  const { id, slug } = await setUpEntity(params);
  return { id, slug };
}

// that's then wrapped in a command
function setupEnvironment(params) {
  return cy.task("setupEnvironmentTask", params);
}

Cypress.Commands.add("setupEnvironment", setupEnvironment);

问题是

cy.location
上的断言运行并立即失败,而不考虑超时。

我可以看到测试数据正在旋转,并且初始

visit
调用开始加载页面,但测试立即失败。

我最好的猜测是,因为这是链接到

task
的,那么这就打破了 Cypress 对回调中等待承诺的理解。

有没有办法让Cypress完成任务并返回可用于断言的数据?将其别名为 var 或类似的名称?

cypress
1个回答
0
投票

这是一个简单的复制,可以帮助您调试。

我设置了一个简单的服务器来在接收特定 ID 时执行重定向:

服务器.js

const express = require('express');
const app = express();
const PORT = 7000;

app.get('/', function (req, res) {
  if (req.query.id === '123') {
    setTimeout(() => {
      res.redirect('/user')
    }, 1000)                     // delay here for page compose etc
  } 
});
 
app.get('/user', function (req, res) {
  res.send("Redirected to User Page");
});
 
app.listen(PORT, function (err) {
  if (err) console.log(err);
  console.log("Server listening on PORT", PORT);
});

我填补了您的示例测试中的空白并运行了它

测试

function setupDb() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve()
    }, 1000)           // delay here to simulate stuff happening
    
  })
}
function setUpEntity(params) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({id: '123', slug: 'user'})
    }, 1000)                            // delay again - total setup 2 seconds
    
  })
}
async function setupEnvironment(params) {
  await setupDb();
  const { id, slug } = await setUpEntity(params);
  return { id, slug };
}
Cypress.Commands.add("setupEnvironment", setupEnvironment);

it('redirects from ID to slug', {baseUrl: 'http://localhost:7000'}, () => {
  const params = []
  cy.setupEnvironment(params).then((environment) => {
    cy.visit(`/?id=${environment.id}`)

    cy.location("pathname", { timeout: 3_000 })
      .should('eq', `/${environment.slug}`)
  })
})

Cypress 测试通过

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.