Cypress — не удается сохранить ответ.Данные тела в файл JSON

#cypress

#cypress

Вопрос:

Я успешно создал POST XMLHttpRequest с FormData. Теперь мне нужно записать тело ответа и сохранить его в файле JSON.

 Cypress.Commands.add(
  "Post_Clients",
  (imagePath, imageType, attr1, attr2, attr1Val, done) => {
    cy.fixture(imagePath, "binary").then(imageBin => {
      Cypress.Blob.binaryStringToBlob(imageBin, imageType).then(blob => {
        const xhr = new XMLHttpRequest();
        xhr.withCredentials = true;
        const data = new FormData();
        data.set(attr1, attr1Val);
        data.set(attr2, blob);
        xhr.open("POST", "https://api.teamapp.myhelpling.com/admin/clients");
        xhr.responseType = "json"
        xhr.setRequestHeader("accept", "application/json");
        xhr.setRequestHeader("access-token", accesstoken);
        xhr.setRequestHeader("client", client);
        xhr.setRequestHeader("expiry", expiry);
        xhr.setRequestHeader("token-type", tokentype);
        xhr.setRequestHeader("uid", uid);
        xhr.onload = function() {
          done(xhr);
        };
        xhr.onerror = function() {
          done(xhr);
        };
        xhr.send(data);
      });
    });
  }
);


it.only("API POSTing TEST", () => {
    cy.Post_Clients(
      "/images/clients/Golden JPEG.jpeg",
      "image/jpeg",
      "client[name]",
      "client[client_logo_attributes][content]",
      "Test Attr 1 Value is Hi!!!",
      resp => {
        cy.writeFile(
          "cypress/fixtures/POST API OUTPUT DATA/Client.json",
          resp.response
        );
        expect(response.status).to.eq(201);
      }
    );
  });
  

Пожалуйста, обратите внимание, что expect(response.status).to.eq(201); утверждение работает хорошо.

Следующий код правильно регистрирует тело в консоли

 cy.log("Response Body", resp.response);
console.log("Response Body", resp.response);
  

Тело ответа: —

 {"client":{"id":452,"name":"Test Attr 1 Value is Hi!!!","client_logo":{"id":543,"path":"https://api.teamapp.myhelpling.com/uploads/client_images/6279486665-1551780183.","thumb":"https://api.teamapp.myhelpling.com/uploads/client_images/thumb_6279486665-1551780183.","medium":"https://api.teamapp.myhelpling.com/uploads/client_images/medium_6279486665-1551780183.","large":"https://api.teamapp.myhelpling.com/uploads/client_images/medium_6279486665-1551780183.","filename":"blob","ratio":1.78}}}
  

но

 cy.writeFile(
"cypress/fixtures/POST API OUTPUT DATA/Client.json",resp.response
);
  

не сохраняет тело ответа в клиенте.Файл JSON.

cy.WriteFile, похоже, не работает в этом коде. Я проверил это, передав JSON, например, {«A»:»B»}, и это тоже не попало в JSON.

Ответ №1:

Спасибо всем за любезную помощь. Я заставил это работать, вызвав cy.WriteFile внутри события onLoad перед запуском запроса XHR. Вот пример кода с некоторыми другими обновлениями, которые я сделал для других своих работ: —

 Cypress.Commands.add(
  "Post_Bucket",
  (imagePath, imageType, title, img, titleVal) => {
    cy.fixture(imagePath, "binary").then(imageBin => {
      Cypress.Blob.binaryStringToBlob(imageBin, imageType).then(blob => {
        const xhr = new XMLHttpRequest();
        const data = new FormData();
        data.set(title, titleVal);
        data.set(img, blob);
        cy.readFile(Cypress.env("IDStore")).then(obj => {
          xhr.open(
            "POST",
            Cypress.env("BucketPostURLPart1")  
              obj.journeyID  
              Cypress.env("BucketPostURLPart2"),
            false
          );
          xhr.setRequestHeader("accept", "application/json");
          xhr.setRequestHeader("access-token", accesstoken);
          xhr.setRequestHeader("client", client);
          xhr.setRequestHeader("expiry", expiry);
          xhr.setRequestHeader("token-type", tokentype);
          xhr.setRequestHeader("uid", uid);
          xhr.onload = function() {
            if (this.status === 201) {
              cy.writeFile(
                Cypress.env("BucketOutputFile"),
                JSON.parse(this.responseText)
              );
              cy.readFile(Cypress.env("IDStore")).then(obj => {
                obj.bucketID = JSON.parse(this.responseText).bucket.id;
                cy.writeFile(Cypress.env("IDStore"), obj);
              });
            }
          };
          xhr.send(data);
        });
      });
    });
  }
);
  

Ответ №2:

Это простой пример, попробуйте с этим.

 cy.request('https://jsonplaceholder.cypress.io/users')
.then((response) => {
cy.writeFile('cypress/fixtures/users.json', response.body)
})