Cypress-запросы асинхронны - но как насчет создания нового объекта? - PullRequest
0 голосов
/ 27 мая 2019

Я попытался выполнить запрос с помощью Cypress, а затем создать новые объекты со значением, полученным в ответ, но новые объекты создаются мгновенно, и запрос отправляется после того, как все объекты уже созданы:

describe("example", function() {

    it("of test", function() {

        console.log("1");

        cy.request({
            url: Cypress.env("URL"),
            method: "POST",
            headers: auth_req.authHeaders,
            body: merged_body
        })
            .as("/authorize")
            .then((resp) => {
                console.log("2");
                Cypress.env("resp_code", resp.status);
                console.log("RESP CODE FROM RESPONSE:");
                console.log(resp.status);
            })
            .its("headers")
            .its("content-type")
            .should("include", "application/json");

        console.log("3");
        const var1 = new something.NotImportant;
        console.log("4");
        const var2 = new something.AlsoNotImportant;
        console.log("5");

    }

}

Я ожидал получить «1», «2», «3», «4» и «5» в консоли.Тем не менее, я получаю «1», «3», «4» и «5» почти мгновенно, и через несколько секунд (медленный ответ от сервера) я вижу, что запрос отправляется, а «2» выплевывается на мойconsole.

Мой вопрос: если я правильно понял, запросы асинхронны, и Cypress ожидает их завершения, так почему же тест не ожидает получения ответа и ТОГО создания объектов?Как я могу изменить код, чтобы быть уверенным, что объекты, которые я хочу создать после запроса, используют значение, полученное из запроса при создании новых объектов?Я пытался использовать Cypress.env, но объекты создаются ДО запроса, и вместо значения, считанного из ответа, используется неправильное значение.


Дополнительный вопрос: почему этот код не работает, как предполагалось(зависает компьютер)?

    while (true) {
        cy.wait(5000);
        var resp_code = Cypress.env("resp_code");
        console.log("RESP CODE:");
        console.log(Cypress.env("resp_code"));
    }

"RESP CODE" выводится на консоль примерно каждые 100 мсек. Я полагаю, это потому, что тест асинхронный, и я пытаюсь использовать здесь подход синхронизации.Я прав?

1 Ответ

0 голосов
/ 28 мая 2019

Поскольку это асинхронный режим, вы должны продолжать цепочку команд, чтобы поставить их в очередь.Cypress действительно ожидает выполнения команд (обещаний), но только если вы скажете это с помощью then().

. Вы можете сделать это:

describe("example", function() {

    it("of test", function() {

        console.log("1");

        cy.request({
            url: Cypress.env("URL"),
            method: "POST",
            headers: auth_req.authHeaders,
            body: merged_body
        })
            .as("/authorize")
            .then((resp) => {
                console.log("2");
                Cypress.env("resp_code", resp.status);
                console.log("RESP CODE FROM RESPONSE:");
                console.log(resp.status);

                console.log("3");
                const var1 = new something.NotImportant;
                console.log("4");
                const var2 = new something.AlsoNotImportant;
                console.log("5");
            })
            .its("headers")
            .its("content-type")
            .should("include", "application/json"); 
    }

}

или это:

describe("example", function() {

    it("of test", function() {

        console.log("1");

        cy.request({
            url: Cypress.env("URL"),
            method: "POST",
            headers: auth_req.authHeaders,
            body: merged_body
        })
            .as("/authorize")
            .then((resp) => {
                console.log("2");
                Cypress.env("resp_code", resp.status);
                console.log("RESP CODE FROM RESPONSE:");
                console.log(resp.status);
            })
            .its("headers")
            .its("content-type")
            .should("include", "application/json")
            .then(() => {
                console.log("3");
                const var1 = new something.NotImportant;
                console.log("4");
                const var2 = new something.AlsoNotImportant;
                console.log("5");
            }); 
    }

}
...