如何通过间隔请求才能进行测试? 我尝试了两种重试请求的方法,但都失败了;
我需要上传一个文件,等待一个文件成功导入
第一步,我将文件上传到cypress服务器中
before( ()=> {
//my custom POST command
cy.form_request(url, data)
.then(({id}) => {
然后我等待上传文件的ID
check_It_Till_Success_It(id);
})
})
然后将接收到的ID传递给新请求,以在服务器上验证其状态,并且需要重复该请求,直到文件处理完成。 在下面的解决方案中说
CypressError:cy.wait()仅接受路由的别名。 别名“ check_it_request”与路线不匹配。
function check_It_Till_Success_It(id) {
function checkRequest() {
cy.request("GET", "http://localhost:28080/admin/api/catalog/import/status/" + id)
.then(({status}) => {
if (status === "FINISHED" || status === "FAILED") {
clearInterval(check_It);
} else {
console.log('retry one more time');
}
}).as('check_it_request');
cy.wait("@check_it_request");
}
checkRequest();
const check_It = setInterval(checkRequest, 1000);
}
或者这是我通过递归请求的另一种解决方案:
function check_It_Till_Success_It(id) {
return (
cy.request("GET", BASE_URL + "/admin/api/catalog/import/status/" + id)
.then(({status}) => {
if (status === "FINISHED" || status === "FAILED") {
console.log('success');
} else {
console.log('retry one more time');
setTimeout(() => check_It_Till_Success_It(id), 1000)
}
})
)
}
但是会引发错误:
未捕获的CypressError:赛普拉斯检测到您从命令中返回了一个承诺,同时还在该承诺中调用了一个或多个cy命令。
我在做什么错了?
答案 0 :(得分:1)
我发现了我的错误,因为使用了本地JS工具作为 setTimeout , setInterval 。
Cypress不允许使用它们,并以可控制的方法代替: cy.clock 和 cy.tick
所以我采用了递归实现,并替换为上面的方法,我的代码变成了:
function check_It_Till_Success_It(id) {
cy.request("GET", BASE_URL + "/admin/api/catalog/import/status/" + id)
.then(resp => {
const status = resp.body.status;
if (status === "FINISHED" || status === "FAILED") {
console.log('success');
} else {
console.log('retry one more time');
cy.clock();
cy.tick(1000);
check_It_Till_Success_It(id)
}
})
}
离题注释 :我是赛普拉斯的新手,据我了解,它取代了大多数js原生功能,因此需要使文档更近一些(BINGO !)或查看issue section,因为某些JS特定功能只是使Cypress 崩溃而没有任何通知或捕获的错误,例如:FormData对象使Cypress的request方法崩溃。