我有一个赛普拉斯测试,如下所示:
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 或类似的名称?
这是一个简单的复制,可以帮助您调试。
我设置了一个简单的服务器来在接收特定 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 测试通过