RequestLogger 'contains' 方法预期行为

RequestLogger 'contains' method expected behavior

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

我正在尝试对请求 URL 参数实施断言,并根据前端用例触发 firing/not 请求。

被测组件是一个table过滤面板,有很多过滤器。

所以我一个一个测试每个过滤器,并根据每个过滤器类型对请求参数格式进行断言。

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

根据我的理解,如果我在执行最后一个断言之前没有调用记录器的 "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();
});

您可以使用记录器和 Node.js 模块 (url, querystirng) 检查此最终请求中是否没有过滤器参数。例如:

.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 == '' ...

}