TestCafe как поделиться переменными из RequestHook - PullRequest
3 голосов
/ 01 июля 2019

Мы хотим автоматизировать тестирование для наших аналитических вызовов.Я в настоящее время оцениваю инструменты тестирования переднего конца, которые могут быть использованы для этого.Я обнаружил, что TestCafe Studio - это то, что нам нужно для создания тестов, но сначала мне нужно некоторое подтверждение концепции.Таким образом, я пытаюсь сначала написать простой тестовый пример.Но я борюсь с тем, что кажется самым основным.Я хочу утверждать, что некоторые параметры в запросе имеют определенное значение.Поэтому я создал RequestHook в соответствии с документацией: https://devexpress.github.io/testcafe/documentation/test-api/intercepting-http-requests/creating-a-custom-http-request-hook.html (что они пропускают, так это то, что вам нужно экспортировать свой класс, если вы поместите его в отдельный файл ...) У меня две проблемысейчас:

  1. Как мне ждать выполнения этого запроса?await t только для страницы, которую я запрашиваю, но затем вызов аналитики выполняется позже.
  2. Как предоставить тесту некоторые данные, собранные в ловушке?

Вот как далеко я продвинулся (я получил URL в консоли):

import { RequestHook} from 'testcafe';

export class AnalyticsRequestHook extends RequestHook {
    constructor (requestFilterRules, responseEventConfigureOpts) {
        super(requestFilterRules, responseEventConfigureOpts);
    }
    async onRequest (event) {
        console.log(event.requestOptions.url);
    }
    async onResponse (event) {
    }
}

Затем я создаю экземпляр этого класса с помощью:

const analyticsRequestHook = new AnalyticsRequestHook(/https:\/\/trackinghost.com\//);

В некоторых других примерах они простоимпортируйте t, и вы должны иметь доступ к нему в методах.Но это, похоже, не работает для RequestHooks, так как я получаю следующую ошибку, как только я пытаюсь получить доступ к t:

Не удается неявно разрешить тестовый прогон, в контексте которого действие контроллера тестадолжно быть выполнено.Вместо этого используйте аргумент тестовой функции 't'.

Но в onRequest я не могу передать другие аргументы.

Так что мои два вопроса даже возможны, если да, пожалуйста, предоставьтеНапример, я действительно полный новичок с testcafe.

Ответы [ 2 ]

2 голосов
/ 01 июля 2019

они пропускают то, что вам нужно экспортировать ваш класс, если вы поместите его в отдельный файл ...

Это не связано с платформой TestCafe.Это часть стандарта JavaScript (см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export).

Как мне ждать выполнения этого запроса? Ожидание t только для запрашиваемой страницы, но затем выполняется вызов аналитикипозже. Как предоставить тесту некоторые данные, собранные в хуке?

Использовать способ, описанный в примере из этого раздела документации - https://devexpress.github.io/testcafe/documentation/test-api/intercepting-http-requests/logging-http-requests.html

fixture `Fixture`;

class AnalyticsRequestHook extends RequestHook {
    constructor (requestFilterRules, responseEventConfigureOpts) {
        super(requestFilterRules, responseEventConfigureOpts);
    }
    async onRequest (event) {
        console.log(event.requestOptions.url);
    }
    async onResponse (event) {
    }
}

const analyticsRequestHook = new AnalyticsRequestHook(/https:\/\/trackinghost.com\//);

test
    .requestHooks(analyticsRequestHook)
    ('test', async t => {
        // Ensure that the response has been received and that its status code is 200.
        await t.expect(analyticsRequestHook.contains(record => record.response.statusCode === 200)).ok();

        const logRecord = analyticsRequestHook.requests[0];

        await t.expect(logRecord.request.url).eql('expected value');
    });

Невозможно неявно разрешить выполнение теста, в контексте которого должно выполняться действие контроллера теста. Вместо этого используйте аргумент 't' функции теста.

Не могли бы вы предоставить код теста, который вызывает этосообщение об ошибке?

0 голосов
/ 04 июля 2019

После дня попыток и ошибок я нашел решение на основе комментариев другого ответа. Я просто использовал RequestLogger неправильно, поскольку я пытался сделать свои утверждения в первом ожидании. Итак, документация почти правильная. Вот мой тестовый пример:

import { AnalyticsUrlParser } from './AnalyticsUrlParser.js';

const analyticsLogger = RequestLogger(/https:\/\/trackingdomain.com\//);

fixture('Analytics Test')
    .page('https://testdomain.com/en.html')
    .requestHooks(analyticsLogger);

test('Page load', async t => {
    await t.expect(analyticsLogger.count(record => record.response.statusCode === 200)).eql(1);

    const urlParser = new AnalyticsUrlParser(analyticsLogger.requests[0].request);
    const messages = urlParser.assertAll({
        pageName: 'Homepage English',
        events: ['event1'],
    });
    await t.expect(messages.length === 0).ok(messages.join('\n'));
}

AnalyticsUrlParser - это мой собственный класс, который анализирует параметр запроса и с помощью assertAll проверяет, соответствуют ли определенные параметры указанному значению. Если нет, это добавляет к массиву сообщений, которые затем распечатываются.

...