Я попытался выполнить запрос с помощью Cypress, а затем создать новые объекты со значением, полученным в ответ, но новые объекты создаются мгновенно, а запрос отправляется после того, как все объекты уже созданы:
describe("example", function() {
it("of test", function() {
console.info("1");
cy.request({
url: Cypress.env("URL"),
method: "POST",
headers: auth_req.authHeaders,
body: merged_body
})
.as("/authorize")
.then((resp) => {
console.info("2");
Cypress.env("resp_code", resp.status);
console.info("RESP CODE FROM RESPONSE:");
console.info(resp.status);
})
.its("headers")
.its("content-type")
.should("include", "application/json");
console.info("3");
const var1 = new something.NotImportant;
console.info("4");
const var2 = new something.AlsoNotImportant;
console.info("5");
}
}
Я ожидал получить "1", "2", "3", "4" и "5" в консоли. Однако я получаю «1», «3», «4» и «5» почти мгновенно и через несколько секунд (медленный ответ от сервера) я вижу, что запрос отправляется и «2» выплевывается на мой приставка.
Мой вопрос: если я правильно понимаю, запросы являются асинхронными, и Cypress ждет их завершения, так почему же тест не ждет получения ответа и ТОГДА не создает объекты? Как я могу изменить код, чтобы быть уверенным, что объекты, которые я хочу создать после запроса, используют значение, полученное из запроса во время создания новых объектов? Я пытался использовать Cypress.env, но объекты создаются ДО запроса и вместо значения, прочитанного из ответа, используется неверное значение.
Бонусный вопрос: почему этот код не работает должным образом (зависает компьютер)?
while (true) {
cy.wait(5000);
var resp_code = Cypress.env("resp_code");
console.info("RESP CODE:");
console.info(Cypress.env("resp_code"));
}
«КОД ОТВЕТА» выводится на консоль каждые 100 мс, я полагаю, это потому, что тест асинхронный, и я пытаюсь использовать подход синхронизации здесь. Я прав?
Поскольку это асинхронно, вам нужно сохранять цепочки команд, чтобы ставить их в очередь. Cypress действительно ждет завершения команд (обещаний), но только если вы скажете об этом с помощью then()
.
Вы можете сделать это:
describe("example", function() {
it("of test", function() {
console.info("1");
cy.request({
url: Cypress.env("URL"),
method: "POST",
headers: auth_req.authHeaders,
body: merged_body
})
.as("/authorize")
.then((resp) => {
console.info("2");
Cypress.env("resp_code", resp.status);
console.info("RESP CODE FROM RESPONSE:");
console.info(resp.status);
console.info("3");
const var1 = new something.NotImportant;
console.info("4");
const var2 = new something.AlsoNotImportant;
console.info("5");
})
.its("headers")
.its("content-type")
.should("include", "application/json");
}
}
Или это:
describe("example", function() {
it("of test", function() {
console.info("1");
cy.request({
url: Cypress.env("URL"),
method: "POST",
headers: auth_req.authHeaders,
body: merged_body
})
.as("/authorize")
.then((resp) => {
console.info("2");
Cypress.env("resp_code", resp.status);
console.info("RESP CODE FROM RESPONSE:");
console.info(resp.status);
})
.its("headers")
.its("content-type")
.should("include", "application/json")
.then(() => {
console.info("3");
const var1 = new something.NotImportant;
console.info("4");
const var2 = new something.AlsoNotImportant;
console.info("5");
});
}
}
Ты мой личный герой на сегодня :)