【问题标题】:Can Cypress intercept requests being made directly to a server?赛普拉斯可以拦截直接向服务器发出的请求吗?
【发布时间】:2021-12-17 19:03:35
【问题描述】:

我一直在尝试使用 Cypress 的拦截方法拦截服务器请求。 我注意到 Cypress 可以拦截通过前端/浏览器发出的请求,但是,如果我直接向后端服务器发出请求,则拦截方法不起作用。

让我澄清一下我的意思:

  • 一件事是拦截前端/浏览器向后端服务器发出的请求。
  • 另一件事是拦截不使用浏览器但直接调用后端端点的调用。

例如: 我可以使用前端界面创建用户 或者我可以创建一个用户直接调用后端端点(直接调用服务器)。

回到我的问题。有没有办法拦截直接对后端端点进行的调用?

这是我迄今为止尝试过的:

  • 我写了一个正则表达式来拦截api/v0/customers
  • 然后我向http://locahost:5440/api/v0/customers(这是服务器的URL)发出请求
  • 最后,我等待请求发生

Timeout request using Cypress intercept method

    cy.intercept(/^\/api\/v0\/customers\/$/).as('createCustomer');
    cy.request(createCustomer(customerData, headers));
    cy.wait('@createCustomer').then(({ status, body }) => {
      const customerId = body.customer_id;
      console.log(body);
      expect(status).equal(201);
    });

问题是:出现超时错误。

  • 正如您在图片中看到的,我正在向http://locahost:5440 发出请求,这是服务器 URL。注意:我确保服务器已启动并正在运行。
  • 正则表达式也是正确的,它将匹配端点http://locahost:5440/api/v0/customers

我怀疑拦截仅适用于通过浏览器发出的请求。这个说法正确吗?我在赛普拉斯文档的任何地方都找不到这个答案。 有没有办法让我拦截直接向服务器发出的调用(不使用浏览器)?

【问题讨论】:

    标签: testing integration-testing cypress


    【解决方案1】:

    您不必拦截您使用 cypress 明确提出的请求,只需使用 .then 获取响应,如下所示:

    cy.request(createCustomer(customerData, headers)).then((response) => { 
        const customerId = response.body.customer_id; 
        console.log(response.body);
        expect(response.status).equal(201);
    });
    

    参考:https://docs.cypress.io/api/commands/request#Yields

    【讨论】:

    • 我在原始问题中添加了更多细节。希望这可以澄清事情。
    • 编辑了我的答案。让我知道这是否有效。
    • 您的解决方案确实有效,这很好!但我想如果不使用浏览器/前端,就无法拦截直接向后端端点发出的请求。
    • 如果浏览器/前端是指 cypress Test Runner,不,没有它就没有办法。
    • 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    相关资源
    最近更新 更多