Запросы Cypress асинхронны, но как насчет создания нового объекта?

Я попытался выполнить запрос с помощью 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 мс, я полагаю, это потому, что тест асинхронный, и я пытаюсь использовать подход синхронизации здесь. Я прав?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
2 116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку это асинхронно, вам нужно сохранять цепочки команд, чтобы ставить их в очередь. 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");
            }); 
    }

}

Ты мой личный герой на сегодня :)

Wojciech Sabaj 28.05.2019 09:34

Другие вопросы по теме