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