【问题标题】:Unable to use minimatch with intercept in Cypress 6.2.1无法在赛普拉斯 6.2.1 中使用带有拦截的 minimatch
【发布时间】:2021-01-12 20:46:23
【问题描述】:

我有一个关于 cy.intercept 的问题,我似乎无法弄清楚如何解决,在我们的项目中我们曾经使用路由,但现在尝试开始使用拦截。所以,我们的 rotes 过去是这样定义的:

'upload: {route: `api/cases/import-data/**`, alias:'upload'}

所以我们使用 minimatch 的 ** 来处理 import-data/ 之后的任何内容,而这目前不适用于拦截。

所以我现在尝试使用 RegExp,所以我的问题很简单,我应该在 RegExp 中用什么替换 **?似乎没有任何工作,我收到超时错误。

我的功能:

function listener({ route, method = 'POST', onRes = () => { }, alias = 'listener' }) {
  const url = new RegExp(`${Cypress.config().beUrl}${route}`);

  cy.intercept(
    method,
    url,
    (req) => {
      req.reply(res => {
        onRes(res);
      });
    }
  ).as(alias);
}

【问题讨论】:

    标签: cypress


    【解决方案1】:

    使用正则表达式,您不需要任何东西来替换 minimatch '**'。 "api/cases/import-data/**" 可以翻译成/api\/cases\/import-data/

    但请注意转义的正斜杠,我认为这是

    中缺少的成分
    const url = new RegExp(`${Cypress.config().beUrl}${route}`)
    

    您用于构建正则表达式的字符串不包含路径分隔符的反斜杠转义。

    这可能有效

    const escapedBaseUrl = Cypress.config().beUrl.replace('/', '\/');
    const escapedRoute = route.replace('/', '\/');
    const url = new RegExp(`${escapedBaseUrl}${escapedRoute}`);
    

    但迟早你会遇到其他需要转义的字符,所以你可以使用像regex-escape这样的包,

    const RegexEscape = require("regex-escape");
    ...
    const url = new RegExp(RegexEscape(`${Cypress.config().beUrl}${route}`));
    

    【讨论】:

    • 所以,我终于弄清楚了问题所在,基本上,我需要像这样使用\w+ 而不是**api\/cases\/import-data\/\\w+$ 并将url和方法作为对象属性传递,例如: 这个cy.intercept({ url, method, matchUrlAgainstPath: false},也replace 不会替换双斜杠,比如http://,所以用replaceAll 代替。谢谢你的回答,对我有点帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2021-10-09
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多