Предупреждения журнала MSW для необработанных запросов Supertest

В своих тестах с использованием 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/apiэто тот, который Supertest делает для приложения, и в этом весь смысл теста, а не тот, который MSW должен обрабатывать. Эти предупреждения также не отображались, когда я впервые писал тесты.

На связанной странице показано, как создать обработчик, но я не хочу, чтобы 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);
    });
  });
});

2 ответа

Эта функция была представлена ​​в MSW v0.20.0, но в v0.29.0 настройка по умолчанию для необработанных запросов изменена с на "warn", следовательно, предупреждения внезапно появляются в консоли. Вы можете сбросить его на "bypass" как показано в документации для setupWorker#start или же setupServer#listen, в моем случае:

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

Однако это может означать отсутствие предупреждений для запросов, которые вы должны обрабатывать, поэтому другой вариант - передать функцию, которая получает объект запроса. Это может, например, зарегистрировать предупреждение или выдать ошибку (что приведет к сбою теста). В моем случае, поскольку все мои запросы к супертесту были /api конечные точки, которые выглядели так:

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

Всем, кто использует воркер, а не сервер — вы можете передать объект с полем «onUnhandledRequest», установленным на «обход», в метод «старт» воркера, например:

      worker.start({
    onUnhandledRequest: 'bypass',
});

Дополнительные параметры включали «предупреждение» и «ошибка» https://mswjs.io/docs/api/setup-worker/start#onunhandledrequest .

Другие вопросы по тегам