无法在 Cypress 6.2.1 中使用带拦截的 minimatch

时间:2021-01-12 20:46:23

标签: cypress

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

'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);
}

1 个答案:

答案 0 :(得分: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}`));