我对柏树测试有疑问。
我正在执行以下操作:
cy.route()
到带有别名的网址
然后cy.wait(@alias)
我知道,如果没有对该URL的任何请求,赛普拉斯的默认操作是使测试失败。
我的问题是我有多个请求,其中一个可能无法到达请求网址。但我不想让测试失败,只是跳过它。我该怎么办?
基本上,我想问的是,如何使您的测试不失败:
CypressError: Timed out retrying: cy.wait() timed out waiting 30000ms for the 221st response to the route: 'productRequest'. No response ever occurred.
答案 0 :(得分:0)
如果您的用例是等待请求,然后继续执行更多命令,则此解决方案可能会帮助您:
describe("route", () => {
it("hiting route", () => {
let req1 = false;
let req2 = false;
cy.server()
cy.route({
methdod: "GET",
onRequest: () => {
req1 = true;
},
url: "/will/eventually/called"
});
cy.route({
methdod: "GET",
onRequest: () => {
req2 = true;
},
url: "/will/eventually/called2"
});
setTimeout(() => {
req2 = true
}, 2000)
cy.visit("https://biehler-josef.de")
cy.get("body").should(() => {
if (req1) {
expect(req1).to.eq(true);
}
if (req2) {
expect(req2).to.eq(true);
}
if (!req1 && !req2) {
expect(false).to.eq(true)
}
});
cy.get("body").should("exist");
});
})
您定义路线并传递一个onRequest
函数来设置变量。这可以通过多条路线来完成。然后,将should
与回调函数一起使用。在其中,您可以检查两个变量并仅在没有请求发生时强制失败。此示例中的setTimeout
演示了一个需要2秒才能完成的请求。
如果要检查是否未找到请求,则要容易得多。但是,如果您想在cy.wait(@alias)
之后执行其他命令,则无法使用此解决方案:
describe("route", () => {
it("hiting route", (done) => {
cy.server()
cy.route("GET", "will/never/be/hit").as("requestalias");
cy.visit("https://biehler-josef.de")
cy.on("fail", (error) => {
if (error.name === "CypressError"
&& error.message.match(/.*Timed out retrying: cy.wait().*requestalias.*/)) {
// calling done forces cypress to turn test to green
done()
}
});
cy.wait("@requestalias")
});
})
使用cy.on("fail")
,您可以侦听测试失败时引发的事件。在其中done()
进行校正会强制测试变为绿色。但是您不能在测试中继续执行后续命令。因此wait()
必须是测试中的最后一条命令