如何重复请求直到在 Cypress 中得到不同的响应
How to repeat a request until getting a different response in Cypress
我正在处理链式请求,需要等到满足条件才能测试响应。之前的请求总是 return 一个响应,但我需要它的状态是“完成”,有时它是“进行中”。我不想对此 cy.wait() 使用静态等待,因为这要么使测试不稳定,要么永远持续下去。我能怎么做?
到目前为止,这是我的代码,但它卡住了并且永远不会完成。使用静态等待(无循环)效果很好。
有什么想法吗?
it('name of the test', function() {
cy.processFile().then((response) => {
let i=0;
while (i<5){
cy.wait(1000);
cy.getInfo().then((resp) => {
if(resp.body.status !== 'finished'){
i++;
} else {
i = 5;
expect(.....);
}
})
}
})
})
while (i<5) {
语句是同步的,甚至在测试开始之前它就运行了五次迭代。
相反,这应该有效
function waitForStatus (status, count = 0) {
if (count === 5) {
throw 'Never finished'
}
return cy.getInfo().then(resp => {
if (resp.body.status !== status) {
cy.wait(1000) // may not need to wait
waitForStatus(status, ++count) // run again, up to 5 times
} else {
return resp // in case you want to expect(resp)...
}
})
}
cy.processFile().then((response) => {
waitForStatus('finished').then(resp => {
expect(resp)...
})
})
这里有更详细的信息Writing a Cypress Recursive Function
您的场景
npm i -D cypress-recurse
# or use Yarn
yarn add -D cypress-recurse
import { recurse } from 'cypress-recurse'
it('waits for status', () => {
cy.processFile().then((response) => {
recurse(
() => cy.getInfo(),
(resp) => resp.body.status === 'finished',
{
log: true,
limit: 5, // max number of iterations
timeout: 30000, // time limit in ms
delay: 1000 // delay before next iteration, ms
},
)
.then(resp => {
expect(resp)...
})
})
我正在处理链式请求,需要等到满足条件才能测试响应。之前的请求总是 return 一个响应,但我需要它的状态是“完成”,有时它是“进行中”。我不想对此 cy.wait() 使用静态等待,因为这要么使测试不稳定,要么永远持续下去。我能怎么做? 到目前为止,这是我的代码,但它卡住了并且永远不会完成。使用静态等待(无循环)效果很好。
有什么想法吗?
it('name of the test', function() {
cy.processFile().then((response) => {
let i=0;
while (i<5){
cy.wait(1000);
cy.getInfo().then((resp) => {
if(resp.body.status !== 'finished'){
i++;
} else {
i = 5;
expect(.....);
}
})
}
})
})
while (i<5) {
语句是同步的,甚至在测试开始之前它就运行了五次迭代。
相反,这应该有效
function waitForStatus (status, count = 0) {
if (count === 5) {
throw 'Never finished'
}
return cy.getInfo().then(resp => {
if (resp.body.status !== status) {
cy.wait(1000) // may not need to wait
waitForStatus(status, ++count) // run again, up to 5 times
} else {
return resp // in case you want to expect(resp)...
}
})
}
cy.processFile().then((response) => {
waitForStatus('finished').then(resp => {
expect(resp)...
})
})
这里有更详细的信息Writing a Cypress Recursive Function
您的场景
npm i -D cypress-recurse
# or use Yarn
yarn add -D cypress-recurse
import { recurse } from 'cypress-recurse'
it('waits for status', () => {
cy.processFile().then((response) => {
recurse(
() => cy.getInfo(),
(resp) => resp.body.status === 'finished',
{
log: true,
limit: 5, // max number of iterations
timeout: 30000, // time limit in ms
delay: 1000 // delay before next iteration, ms
},
)
.then(resp => {
expect(resp)...
})
})