Testing TestCafe如何从RequestHook共享变量

Testing TestCafe如何从RequestHook共享变量,testing,automated-tests,e2e-testing,testcafe,web-testing,Testing,Automated Tests,E2e Testing,Testcafe,Web Testing,我们希望为我们的分析呼叫自动化测试。我目前正在评估前端测试工具,可以用于此。我发现TestCafe Studio是我们创建测试所需要的,但首先我需要一些概念证明。因此,我尝试先编写一个简单的测试用例。但我在与似乎是最基本的东西作斗争。我想断言请求中的某些参数具有特定值。因此,我所做的是根据文档创建一个RequestHook:https://devexpress.github.io/testcafe/documentation/test-api/intercepting-http-requests

我们希望为我们的分析呼叫自动化测试。我目前正在评估前端测试工具,可以用于此。我发现TestCafe Studio是我们创建测试所需要的,但首先我需要一些概念证明。因此,我尝试先编写一个简单的测试用例。但我在与似乎是最基本的东西作斗争。我想断言请求中的某些参数具有特定值。因此,我所做的是根据文档创建一个
RequestHook
:https://devexpress.github.io/testcafe/documentation/test-api/intercepting-http-requests/creating-a-custom-http-request-hook.html (它们忽略的是,如果将类放在单独的文件中,则需要导出该类…) 我现在有两个问题:

  • 我如何等待执行此请求?
    wait t t
    仅适用于我请求的页面,但分析调用随后会执行
  • 如何为测试提供钩子中收集的一些数据
  • 以下是我取得的成绩(我在控制台中获得了URL):

    然后,我用以下命令实例化该类:

    const analyticsRequestHook = new AnalyticsRequestHook(/https:\/\/trackinghost.com\//);
    
    在其他一些示例中,它们也只导入
    t
    ,您应该可以在方法中访问它。但这似乎对RequestHooks不起作用,因为我一尝试访问
    t
    ,就会出现以下错误:

    无法隐式解析在其上下文中运行的测试 应执行测试控制器操作。使用测试函数的“t” 而不是争论

    但是在
    onRequest
    中,我无法传递其他参数

    所以我的两个问题是否可能,如果可能,请提供一个例子,因为我确实是testcafe的新手

    它们忽略的是,如果将类放在单独的文件中,则需要导出它

    它与TestCafe框架无关。它是JavaScript标准的一部分(请参阅)

    我如何等待执行此请求?wait t t仅适用于我请求的页面,但分析调用随后会执行。 如何为测试提供钩子中收集的一些数据

    使用本文档主题示例中描述的方法-

    fixture`fixture`;
    类AnalyticsRequestHook扩展了RequestHook{
    构造函数(requestFilterRules、responseEventConfigureOpts){
    超级(请求过滤器规则、响应过滤器配置文件);
    }
    异步onRequest(事件){
    log(event.requestOptions.url);
    }
    异步onResponse(事件){
    }
    }
    const analyticsRequestHook=新的analyticsRequestHook(/https:\/\/trackinghost.com\/);
    测试
    .RequestHook(分析性RequestHook)
    ('test',异步t=>{
    //确保已收到响应,且其状态代码为200。
    wait t t.expect(analyticsRequestHook.contains(record=>record.response.statusCode==200)).ok();
    const logRecord=analyticsRequestHook.requests[0];
    wait t.expect(logRecord.request.url).eql('expected value');
    });
    
    无法隐式解析应在其上下文中执行测试控制器操作的测试运行。改用测试函数的't'参数


    您能提供引发此错误消息的测试代码吗?

    经过一天的尝试,我根据另一个答案的注释找到了解决方案。我只是在第一次尝试进行断言时,错误地使用了
    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
    检查某些参数是否与提供的值匹配。如果没有,它会添加到一系列消息中,然后打印出来。

    谢谢你的帖子,但它没有回答我的问题。RequestLogger不同于自定义RequestHook。我看了一下前者的代码,它使用了大量的内部助手,我不知道如何将它们包含在我的自定义代码中,因为它们并没有真正导出。关于错误,如果在onRequest方法中添加t.debug()或t.ctx,就会发生错误。t在此上下文中是未知的。如果您的请求钩子中不需要特定/自定义逻辑,则可以使用内置钩子来等待执行请求。您可以在上面的示例和TestCafe文档中看到如何使用
    RequsetLogger
    ,请向我们提供有关您的测试用例的更多详细信息:-您的测试页面-钩子和测试的代码-您希望在自定义钩子中实现什么逻辑?您不能在请求钩子的代码中使用TestCafe操作。要调试钩子,请查看。如果要存储某些值,可以使用变量而不是
    t.ctx
    。如果此功能不适合您的需要,请告诉我们。@HelenDikareva试图解决多个注释:1。我认为使用RequestLogger或RequestHook没有什么区别。因为请求独立于页面加载,所以它并不总是等待这个额外的请求。也许我做错了什么。2.将其包装在自定义钩子中可以更容易地重用,但也许我也可以通过一个助手函数/类来实现这一点。3.在自定义RequestHook中,我没有访问t的权限,因此也没有访问t.ctx的权限。查看我在问题中发布的错误。
    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'));
    }