首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用Cypress的MSW运行时请求处理程序(NextJ,Cypress,MSW)

不使用Cypress的MSW运行时请求处理程序(NextJ,Cypress,MSW)
EN

Stack Overflow用户
提问于 2022-12-01 21:49:48
回答 1查看 44关注 0票数 1

我正在使用NextJ与柏树和垃圾。我想使用Cypress中的MSW工作人员来灵活地模拟我的api请求的响应,以便为所有类型的测试提供一个通用的模拟工具。

工作者设置中的MSW处理程序(在NextJs中)正在拦截来自Cypress测试运行的请求,没有任何问题。但是,当我在Cypress中定义运行时请求处理程序以覆盖现有处理程序或添加特定于测试的处理程序时,api请求不会被截获。

以下是相关档案:

./test/server/testWorker.ts

代码语言:javascript
复制
import { graphql, setupWorker } from "msw";
import { handlers } from "./serverHandlers";

const worker = setupWorker(...handlers);

window.msw = {
  worker,
  graphql,
};

export * from "msw";
export { worker };

./test/server/index.ts

代码语言:javascript
复制
async function initMocks() {
  if (typeof window !== "undefined") {
    const { worker } = await import("./testWorker");
    worker.start();
  }
}

initMocks();

export {};

./_app.tsx

代码语言:javascript
复制
...
if (process.env.NEXT_PUBLIC_API_MOCKING === "enabled") {
  require("../test/server");
}

function MyApp({....
...

./柏树/e2e/test.cy.ts

代码语言:javascript
复制
describe("test", () => {
  const data = buildTestData();
  beforeEach(() => {
    cy.visit("/");
    cy.window().then((window) => {
      const { worker, graphql } = window.msw;
// This runtime request handler does not work
      worker.use(
        graphql
          .link("https://example/graphql.json")
          .query(/fetchdata/i, (req, res, ctx) => {
            return res(
              ctx.data({
                data
              })
            );
          })
      );
    });
  });
...

worker.printHandlers()命令显示控制台中的运行时请求处理程序已注册,但请求未被截获。MSW警告我,在我的控制台中“捕获了一个没有匹配请求处理程序的请求”。

我很感谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2022-12-02 22:26:37

看起来您正在尝试使用Cypress中的MSW工作人员来灵活地模拟API请求的响应。工作设置中的MSW处理程序似乎成功地拦截了Cypress测试运行中的请求,但是当您在Cypress中定义运行时请求处理程序时,API请求不会被截获。

一个潜在的问题可能是,在工作人员启动之前正在调用worker.use()方法。在Cypress测试的beforeEach块中,在从window对象访问worker之后立即调用worker.use()。但是,工作人员可能此时尚未启动,这将阻止注册运行时请求处理程序。

要解决这个问题,可以尝试在调用worker.use()方法之后,在./test/server/index.ts中的initMocks()函数中移动对worker.start()的调用。这将确保在工作人员启动后注册运行时请求处理程序,这将允许工作人员拦截API请求。

下面是如何修改./test/server/index.ts以解决此问题的示例:

代码语言:javascript
复制
async function initMocks() {
  if (typeof window !== "undefined") {
    const { worker } = await import("./testWorker");
    worker.start();

    // Move the call to worker.use() here
    const { graphql } = window.msw;
    worker.use(
      graphql
        .link("https://example/graphql.json")
        .query(/fetchdata/i, (req, res, ctx) => {
          return res(
            ctx.data({
              data
            })
          );
        })
    );
  }
}

initMocks();

export {};

在进行此更改之后,您应该能够在需要时使用Cypress中的运行时请求处理程序来拦截和模拟API请求。我希望这能帮到你!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74648556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档