Javascript 请求记录器';包含';方法预期行为

Javascript 请求记录器';包含';方法预期行为,javascript,automated-tests,devexpress,end-to-end,testcafe,Javascript,Automated Tests,Devexpress,End To End,Testcafe,使用TestCafe框架开发端到端测试套件 我试图实现对请求URL参数的断言,并根据前端用例触发/不触发请求 被测部件类型为带有大量过滤器的台式过滤器面板 因此,我逐个测试每个过滤器,并根据每个过滤器类型对请求参数格式进行断言 最后,我想检查一下,当清除过滤器时,没有使用任何过滤器参数触发请求 在我的理解中,如果我在执行最后一个断言之前没有调用记录器的“clear”方法,那么这应该不会通过。但是测试实际上是绿色的 在我看来,我似乎没有正确理解记录器的行为。包含断言机制?它是否总是只检查最新的请求

使用TestCafe框架开发端到端测试套件

我试图实现对请求URL参数的断言,并根据前端用例触发/不触发请求

被测部件类型为带有大量过滤器的台式过滤器面板

因此,我逐个测试每个过滤器,并根据每个过滤器类型对请求参数格式进行断言

最后,我想检查一下,当清除过滤器时,没有使用任何过滤器参数触发请求

在我的理解中,如果我在执行最后一个断言之前没有调用记录器的“clear”方法,那么这应该不会通过。但是测试实际上是绿色的

在我看来,我似乎没有正确理解记录器的行为。包含断言机制?它是否总是只检查最新的请求?或者它是否检查任何记录的请求

以下是我的测试代码:

test('Transactions Base Filters', async (t) => {
  // amount filter
  await t.typeText(filters.grossAmountMin, '10')
    .expect(filters.activeFilter.count).eql(1)
    .expect(logger.contains(r => (
      r.response.statusCode === 200
      && r.request.url.indexOf('grossAmount=10__value') > 0
    ))).ok()
    .typeText(filters.grossAmountMax, '5')
    .expect(filters.grossAmountMin.getReact(({ props: { error } }) => error)).ok()
    .expect(filters.grossAmountMax.getReact(({ props: { error } }) => error)).ok()
    // check invalid input does not fire a request
    .expect(logger.count(r => r.request.url.indexOf('grossAmount=10__value__5') > 0)).eql(0)
    .typeText(filters.grossAmountMax, '00')
    .expect(filters.grossAmountMin.getReact(({ props: { error } }) => error)).notOk()
    .expect(filters.grossAmountMax.getReact(({ props: { error } }) => error)).notOk()
    .expect(logger.contains(r => (
      r.response.statusCode === 200
      && r.request.url.indexOf('grossAmount=10__value__500') > 0
    ))).ok();

  // orderId filter
  await t.typeText(filters.orderId, '8E')
    .expect(filters.activeFilter.count).eql(2)
    .expect(logger.contains(r => (
      r.response.statusCode === 200
      && r.request.url.indexOf('orderId=*8E*') > 0
    ))).ok()
    .click(filters.orderId)
    .pressKey('ctrl+a delete')
    .expect(filters.activeFilter.count).eql(1);

  // email filter
  await t.typeText(filters.customerEmail, 'fvrecord')
    .expect(filters.activeFilter.count).eql(2)
    .expect(logger.contains(r => (
      r.response.statusCode === 200
      && r.request.url.indexOf('customerEmail=*fvrecord*') > 0
    ))).ok()
    .click(filters.customerEmail)
    .pressKey('ctrl+a delete')
    .expect(filters.activeFilter.count).eql(1);

  // status filter
  await t.click(filters.status)
    .click(filters.statusMenuItem('VALIDATED'))
    .expect(filters.activeFilter.count).eql(2)
    .expect(filters.status.getReact(({ props: { value } }) => value.length)).eql(1)
    .expect(logger.contains(r => (
      r.response.statusCode === 200
      && r.request.url.indexOf('status=VALIDATED') > 0
    ))).ok()
    .click(filters.status)
    .click(filters.statusMenuItem('REFUSED'))
    .expect(filters.status.getReact(({ props: { value } }) => value.length)).eql(2)
    .expect(logger.contains(r => (
      r.response.statusCode === 200
      && r.request.url.indexOf('status=VALIDATED|REFUSED') > 0
    ))).ok()
    .click(filters.status)
    .click(filters.statusMenuItem('VALIDATED'))
    .expect(logger.contains(r => (
      r.response.statusCode === 200
      && r.request.url.indexOf('status=VALIDATED') > 0
    ))).ok()
    .click(filters.status)
    .click(filters.statusMenuItem('REFUSED'))
    .expect(filters.status.getReact(({ props: { value } }) => value.length)).eql(0)
    .expect(filters.activeFilter.count).eql(1);

  // transactionType filter
  await t.click(filters.type)
    .click(filters.statusMenuItem('DEBIT'))
    .expect(filters.activeFilter.count).eql(2)
    .expect(filters.type.getReact(({ props: { value } }) => value.length)).eql(1)
    .expect(logger.contains(r => (
      r.response.statusCode === 200
      && r.request.url.indexOf('type=DEBIT') > 0
    ))).ok();

  // reset all
  // logger.clear();
  await t.click(filters.resetButton)
    .expect(filters.activeFilter.count).eql(0)
    .expect(logger.contains(r => (
      r.response.statusCode === 200
      && r.request.url.indexOf('grossAmount=') < 0
      && r.request.url.indexOf('orderId=') < 0
      && r.request.url.indexOf('customerEmail=') < 0
      && r.request.url.indexOf('status=') < 0
      && r.request.url.indexOf('type=') < 0
    ))).ok();
});
test('Transactions-Base-Filters',异步(t)=>{
//数量过滤器
等待t.typeText(filters.grossAmountMin,'10')
.expect(filters.activeFilter.count).eql(1)
.expect(logger.contains)(r=>(
r、 response.statusCode==200
&&r.request.url.indexOf('grossAmount=10_u值')>0
))).ok()
.typeText(filters.grossAmountMax,'5')
.expect(filters.grossAmountMin.getReact(({props:{error}})=>error)).ok()
.expect(filters.grossAmountMax.getReact(({props:{error}})=>error)).ok()
//检查无效输入不会触发请求
.expect(logger.count(r=>r.request.url.indexOf('grossAmount=10__值___5')>0)).eql(0)
.typeText(filters.grossAmountMax,“00”)
.expect(filters.grossAmountMin.getReact(({props:{error}})=>error)).notOk()
.expect(filters.grossAmountMax.getReact(({props:{error}})=>error)).notOk()
.expect(logger.contains)(r=>(
r、 response.statusCode==200
&&r.request.url.indexOf('grossAmount=10\u值\uu 500')>0
))).ok();
//orderId过滤器
等待t.typeText(filters.orderId,“8E”)
.expect(filters.activeFilter.count).eql(2)
.expect(logger.contains)(r=>(
r、 response.statusCode==200
&&r.request.url.indexOf('orderId=*8E*')>0
))).ok()
.单击(filters.orderId)
.按键('ctrl+a delete')
.expect(filters.activeFilter.count).eql(1);
//电子邮件过滤器
等待t.typeText(filters.customerEmail,“fvrecord”)
.expect(filters.activeFilter.count).eql(2)
.expect(logger.contains)(r=>(
r、 response.statusCode==200
&&r.request.url.indexOf('customerEmail=*fvrecord*')>0
))).ok()
。单击(过滤器。自定义邮件)
.按键('ctrl+a delete')
.expect(filters.activeFilter.count).eql(1);
//状态过滤器
等待t.点击(过滤器状态)
.单击(filters.statusMenuItem('VALIDATED'))
.expect(filters.activeFilter.count).eql(2)
.expect(filters.status.getReact(({props:{value}})=>value.length)).eql(1)
.expect(logger.contains)(r=>(
r、 response.statusCode==200
&&r.request.url.indexOf('status=VALIDATED')>0
))).ok()
。单击(过滤器。状态)
.click(filters.statusMenuItem('densed'))
.expect(filters.status.getReact(({props:{value}})=>value.length)).eql(2)
.expect(logger.contains)(r=>(
r、 response.statusCode==200
&&r.request.url.indexOf('status=VALIDATED |拒绝')>0
))).ok()
。单击(过滤器。状态)
.单击(filters.statusMenuItem('VALIDATED'))
.expect(logger.contains)(r=>(
r、 response.statusCode==200
&&r.request.url.indexOf('status=VALIDATED')>0
))).ok()
。单击(过滤器。状态)
.click(filters.statusMenuItem('densed'))
.expect(filters.status.getReact(({props:{value}})=>value.length)).eql(0)
.expect(filters.activeFilter.count).eql(1);
//事务类型筛选器
等待t.click(filters.type)
.单击(filters.statusMenuItem('DEBIT'))
.expect(filters.activeFilter.count).eql(2)
.expect(filters.type.getReact(({props:{value}})=>value.length)).eql(1)
.expect(logger.contains)(r=>(
r、 response.statusCode==200
&&r.request.url.indexOf('type=DEBIT')>0
))).ok();
//全部重置
//logger.clear();
等待t.单击(filters.Reset按钮)
.expect(filters.activeFilter.count).eql(0)
.expect(logger.contains)(r=>(
r、 response.statusCode==200
&&r.request.url.indexOf('grossAmount=')<0
&&r.request.url.indexOf('orderId=')小于0
&&r.request.url.indexOf('customerEmail=')小于0
&&r.request.url.indexOf('status=')<0
&&r.request.url.indexOf('type=')<0
))).ok();
});

您可以使用logger和Node.js模块(,)检查此最终请求中是否没有筛选参数。例如:

.expect(logger.contains (r => r.response.statusCode == 200 && checkParameters(r.request.url)))

function checkParameters(url) {
   var parsedUrl = url.parse(url):
   var parsedParameters = querystring.parse(url.path);

return parsedParameters.param1 === '' && parsedParamters.param2 == '' ...

}

我们将在以下线程的上下文中解决此问题:@Marion感谢您关注我的问题。此线程不是问题的重复,因为它更多地是关于理解RequestLogger.contains方法的预期行为。1。contains(谓词)方法的工作方式如以下帮助主题中所述:。它返回记录器是否包含与谓词匹配的请求。换句话说,它根据是否至少有一个请求满足谓词返回true/false。看起来在以下场景中存在误解:“最后,我想检查一下,当清除过滤器时,没有使用任何过滤器参数触发请求”。根据我收集的信息,您希望确保在清除筛选器后不会发送带有筛选器参数的请求。然而,根据您的代码,您检查是否发送了请求,但没有参数。请在重置resetAll按钮后将请求发送到的URL发送给我,以便我们检查请求是否定义正确。