Предупреждения журнала 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 .