如何针对真实 API 重用模拟 Cypress 测试 运行?

How to reuse mocked Cypress tests to run against real APIs?

我使用 cy.intercept.

对本地 mocks/fixtures 进行了 Cypress 测试 运行

我想将这些测试 运行 重新用于生产 URL 并禁用网络拦截,以便测试 运行 针对真实 API。

这些是禁用所有 cy.intercept 的方法吗,还是我想错了方向?

有一个插件“cypress-skip-test”。可以根据 OS、浏览器或环境变量跳过测试或代码块。假设您将拦截器设置在 before 或 beforeEach 中,您可以在拦截器调用周围放置一个“onlyOn”或“skipOn”。根据“生产”环境,您可以跳过拦截器的设置。

您致电:

CYPRESS_ENVIRONMENT=production npx cypress run

然后你跳过:

beforeEach(() => {
  skipOn('production', () => {
    cy.intercept(...);
  })
});

Intercepted Requests section 将帮助您实现这一点,但您可能需要重写 cy.intercept() 调用。

如前所述,您需要使用 routeHandler 将条件应用于存根或不 api 调用。

cy.intercept('GET', '/yourEndpoint', (req) => {
    if (Cypress.config('baseUrl') === 'prodUrl') {
        req.continue();
    } else {
        req.reply(your stub here);
    }
});

编辑:cy.intercept() 覆盖示例

我想您正在使用这些 cy.intercept() 签名之一:

在这种情况下,您需要使用 Cypress.Commands.overwrite()staticResponse 变量转换为 routeHandler 回调以结束其中之一:

这是第二个签名的示例 (method, url, staticResponse):

Cypress.Commands.overwrite('intercept', (originalFn, method, url, staticResponse) => {
    originalFn(method, url, (req) => {
        if (Cypress.config('baseUrl') === 'prodUrl') {
           req.continue();
        } else {
           req.reply(staticResponse);
        }
    });
});

如果您使用多个签名,则需要一个逻辑来接受 2 或 3 个参数并将它们相应地映射到 originalFn()