Как получить json-ответ RequestLogger

RequestLogger

A выполните этот тест вне основного контроллера тестирования, используя рецепты модель страницы и это.

/**
  Used to get the periodic analytic id.
  Whenever we are viewing an asset, the server must respond with an id.
  This id is later used by the client, to send periodic analytics.

  @param {object} t          Testcafe's test controller
  @param {object} logger     A testcafe's RequestLogger.
  @returns {string}          Returns the periodic analytic id.
*/
async getPeriodicAnalyticId(t, logger) {
  const logPrefix = 'Get periodic analytic id > ';
  let responseBody;

  await t
    .expect(logger.requests.length).gt(0, logPrefix + 'No requests logged.');

  responseBody = logger.requests[0].response.body;

  await t
    .expect(responseBody).notTypeOf('undefined', logPrefix + 'Logged request does not have a response a body.')
    .expect(Buffer.isBuffer(responseBody)).eql(true, logPrefix + 'Invalid response body (not buffer)');

  // Periodic analytic id can be found on the server response of the 1st analytic sent.
  return JSON.parse(logger.requests[0].response.body.toString()).id;
}

Ошибка

При запуске этого теста, нацеленного на локальный HTTP-сервер, все работает нормально. Но это не удается, когда тесты нацелены на удаленный сервер https. Я получаю такую ​​ошибку:

SyntaxError: Unexpected token  in JSON at position 0

на этой линии

return JSON.parse(logger.requests[0].response.body.toString()).id;

Информация об отладке

Тело ответа от локального HTTP-сервера, который работает: localBuffer Это переводится как: localBufferToString

Тело ответа от удаленного https-сервера, которое не работает: remoteBuffer Это переводится как: remoteBufferToString

Вопрос

Мне интересно, подходит ли метод, который я использую для преобразования тела ответа в json. В настоящее время я использую:

JSON.parse(logger.requests[0].response.body.toString())

Моя среда

operating system: Windows 10
testcafe version: 0.21.1
node.js version: 9.3.0

Я предлагаю вам отладить ваш тест и проверить значения переменных logger.requests [0], logger.requests [0] .response и logger.requests [0] .response.body. Возможно, что некоторые из них ничего не вернут. В следующих статьях описывается, как отлаживать ваш тест: devexpress.github.io/testcafe/documentation/recipes/…, devexpress.github.io/testcafe/documentation/recipes/…

Marion 23.08.2018 09:55

Спасибо, Марион, я сделаю это и доложу. Я забыл сказать, что локальный сервер находится по http, а удаленный по https, если это важно. (Обновил вопрос)

Aris Gatoudis 23.08.2018 10:17

Я обновил отладочную информацию @Marion скриншотами из отладчика.

Aris Gatoudis 23.08.2018 13:04

Возможно, проблема связана с таймаутами TestCafe: t.expect ждет 3 секунды, и этого времени может быть недостаточно для загрузки ресурса. Попробуйте вызвать "wait" перед "ожидать": await t.wait (4000) .expect (logger.contains (record => record.response.statusCode === 200)). Ok (); Если это не помогает, обновите этот пример, чтобы я мог видеть проблему локально: github.com/MarinaRukavitsyna/TestCafe-RequestLogger-example/‌…

Marion 24.08.2018 11:00

@Marion Это не тот случай. На главном контроллере тестирования есть задержка и утверждение для statusCode всех собранных запросов, которые проходят. Я попытаюсь воспроизвести это на более простом примере в вашем коде.

Aris Gatoudis 27.08.2018 12:43

Привет @Marion. Я создал похожий тест здесь github.com/prototype23/Testcafe-RequestLogger-example/blob/…‌. Это не совсем то, что я делаю в своих реальных тестах, но это воспроизводит мою проблему. Как видите, ответ регистратора не читается.

Aris Gatoudis 27.08.2018 17:06

У меня была эта проблема еще и потому, что в моем случае ответом является сжатый поток. Мне пришлось реализовать служебный метод для распаковки основного потока перед анализом данных JSON. Если это ваш случай, я также могу ответить кодом, который я использую для этого.

Ricovitch 30.08.2018 18:21

Привет @ prototype23, ваш тест на моей стороне прошел успешно. На моей стороне в Chrome работает функция JSON.parse (logRecord.response.body). Не могли бы вы указать настройки вашего браузера и ОС?

Marion 06.09.2018 13:48

@Ricovitch Привет. Спасибо за ответ. Не знаю, так ли это. Он пытался реализовать этот рецепт nodejs.org/api/…, но мои response и response.body не являются потоками для конвейерной передачи. Можете ли вы клонировать созданный мной пример и протестировать? Вы можете найти это одним комментарием выше.

Aris Gatoudis 06.09.2018 23:38

Привет @Marion. Мой браузер - это последняя версия Firefox (версия для разработчиков) на windows 10 @ work и windows 7 @ home. Но последний хром тоже терпит неудачу.

Aris Gatoudis 06.09.2018 23:40

Привет, @Marion, возможно, параметр RequestLogger 'stringifyResponseBody': true должен сначала распаковать любой заархивированный ответ, а затем преобразовать его в строку.

Aris Gatoudis 17.10.2018 20:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
11
1 985
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

У меня была такая же проблема, потому что в моем случае ответ сервера был сжатый ответ, а ответом API логгера testcafe не распаковывает автоматически.

Итак, мы выполнили следующие шаги:

Настройте регистратор с параметром logResponseBody (также, как указано в комментарии, не устанавливайте для параметра stringifyResponseBody значение true)

const logger = RequestLogger(
  /yourApiRegex/,
  { logResponseBody: true },
);

Напишите вспомогательный метод для распаковки тела запроса:

import zlib from 'zlib';

export const getBody = async body => new Promise((resolve, reject) => {
  zlib.gunzip(body, async (error, buff) => {
    if (error !== null) {
      return reject(error);
    }
    return resolve(JSON.parse(buff.toString()));
  });
});

Пример использования в тестах

await t.expect(logger.contains(
  async (record) => {
    const body = await (getBody(record.response.body));
    return body.someProps === 'someValue';
  },
)).ok();

Спасибо! Я постараюсь это реализовать. Быстрая проверка на моем примере, где я получаю только тело первого зарегистрированного запроса, не сработала. Получаю: Error: incorrect header check. Я поиграюсь и доложу или приму твой ответ завтра.

Aris Gatoudis 07.09.2018 13:10

Надеюсь, у вас это сработало. Пожалуйста, примите мой ответ, если это помогло.

Ricovitch 20.09.2018 17:35

Спасибо за ожидание @Ricovitch. Пока не нашел времени поиграть. Так что я пока не могу принять ответ.

Aris Gatoudis 24.09.2018 12:29

Спасибо, @Ricovitch, это была причина, по которой я начал тарабарщину. Ответ нужно разархивировать. Возможно, нам стоит добавить 'stringifyResponseBody: false в ваш фрагмент RequestLogger. Вот почему я получал ошибки при реализации ваших примеров. Я тоже обновил свой пример здесь.

Aris Gatoudis 17.10.2018 19:43

Для всех, кого это интересует, я создал второе решение, основанное на ответе Риковича. Утилита для распаковки всех заархивированных ответов из регистратора. Благодаря этому вы можете держать свои утверждения в чистоте. Вы можете найти решение на то же репо. Я также разместил 3 тега на коммитах Git.

Aris Gatoudis 22.10.2018 15:09

Получал такой же Error: incorrect header check. stringifyResponseBody на false исправил это и для меня.

nishantrevo 12.03.2021 12:42

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