微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

未处理的 Supertest 请求的 MSW 日志警告

如何解决未处理的 Supertest 请求的 MSW 日志警告

在我使用 Supertest 和 MSW 的测试中,我注意到,虽然它们仍然成功通过,但 MSW 已经开始显示 Supertest 发出的请求的警告。例如(请参阅帖子末尾的要复制的文件):

$ npm t

> msw-example@1.0.0 test
> jest

 PASS  ./app.test.js
  password API
    ✓ exposes a number of words (76 ms)

  console.warn
    [MSW] Warning: captured a request without a matching request handler:

      • GET http://127.0.0.1:55984/api

    If you still wish to intercept this unhandled request,please create a request handler for it.
    Read more: https://mswjs.io/docs/getting-started/mocks

      at onUnhandledRequest (node_modules/msw/node/lib/index.js:7599:21)
      at node_modules/msw/node/lib/index.js:7630:13
      at fulfilled (node_modules/msw/node/lib/index.js:50:58)

Test Suites: 1 passed,1 total
Tests:       1 passed,1 total
Snapshots:   0 total
Time:        1.005 s
Ran all test suites.

请求 GET http://127.0.0.1:55984/apiSupertest 向应用发出的请求,这是测试的重点,而不是 MSW 需要处理的请求。我第一次编写测试时也没有显示这些警告。

linked page 显示了如何创建处理程序,但我不希望 MSW 处理这些请求。为什么会发生这种情况,我该如何阻止它显示 "/api" 调用的警告?


package.json

{
  "name": "msw-example","version": "1.0.0","description": "","main": "index.js","scripts": {
    "test": "jest"
  },"keywords": [],"author": "","license": "ISC","dependencies": {
    "axios": "^0.21.1","express": "^4.17.1"
  },"devDependencies": {
    "jest": "^27.0.4","msw": "^0.29.0","supertest": "^6.1.3"
  }
}

app.js

const axios = require("axios");
const express = require("express");

const app = express();

app.get("/api",(_,res) => {
  axios.get("https://api.pwnedpasswords.com/range/ABC12")
    .then(() => res.json({ words: 3 }))
    .catch((err) => res.sendStatus(500));
});

module.exports = app;

app.test.js

const { rest } = require("msw");
const { setupServer } = require("msw/node");
const request = require("supertest");

const app = require("./app");

const server = setupServer(
  rest.get("https://api.pwnedpasswords.com/range/:range",(req,res,ctx) => {
    return res(ctx.status(200),ctx.text(""));
  }),);

describe("password API",() => {
  beforeAll(() => server.listen());

  beforeEach(() => server.resetHandlers());

  afterall(() => server.close());

  it("exposes a number of words",() => {
    return request(app).get("/api").expect(200).then((res) => {
      expect(res.body.words).toBe(3);
    });
  });
});

解决方法

此功能是在 MSW v0.20.0 中引入的,但在 v0.29.0 中未处理请求的默认设置从 "bypass" 更改为 "warn",因此控制台中突然出现警告.您可以将其重置为 "bypass",如 setupWorker#startsetupServer#listen 的文档中所示,在我的情况下:

beforeAll(() => server.listen({ onUnhandledRequest: "bypass" }));

然而,这可能意味着您应该处理的请求缺少警告,因此另一种选择是传递接收请求对象的函数。这可以例如记录警告或抛出错误(这将导致测试失败)。就我而言,由于我所有的 Supertest 请求都是针对 /api 端点的,因此看起来像:

beforeAll(() => server.listen({ 
  onUnhandledRequest: ({ method,url }) => {
    if (!url.pathname.startsWith("/api")) {
      throw new Error(`Unhandled ${method} request to ${url}`);
    }
  },}));

正如 kettanaito 在评论中所建议的,我调查了您是否可以通过标头识别 Supertest 调用。不幸的是,Supertest no longer 似乎设置了默认 User-Agent,因此您必须逐个测试:

describe("password API",() => {
  beforeAll(() => server.listen({ 
    onUnhandledRequest: ({ headers,method,url }) => {
      if (headers.get("User-Agent") !== "supertest") {
        throw new Error(`Unhandled ${method} request to ${url}`);
      }
    },}));

  beforeEach(() => server.resetHandlers());

  afterAll(() => server.close());

  it("exposes a number of words",() => {
    return request(app)
      .get("/api")
      .set("User-Agent","supertest")
      .expect(200)
      .then((res) => {
        expect(res.body.words).toBe(3);
      });
  });
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。