#reactjs #msw
Вопрос:
Итак, я пишу тесты для одного из своих проектов react, и я просто решил использовать mock service worker, чтобы издеваться над моими вызовами api, и я пытаюсь издеваться над конечной точкой входа.Поэтому я пытаюсь имитировать ошибку входа в систему, когда я возвращаю сообщение об ошибке, когда ввод не соответствует определенному электронному письму. Учитывая приведенный ниже код;
const server = setupServer( rest.post("https://testlogin.com/api/v1/login", (req, res, ctx) =gt; { // the issue is getting the email from the request body something like the code just below if (req.body["email"] != "test@example.com") { ctx.status(401); return res( ctx.json({ success: false }) ); } }) );
Как я могу это сделать? Есть ли лучший способ сделать это?
Ответ №1:
Вы должны быть в состоянии получить req.body.email
значение, указанное в заголовке вашего запроса Content-Type: application/json
. Без заголовка типа содержимого ни MSW, ни ваш фактический сервер не могли бы знать, какие данные вы пытаетесь отправить (во всяком случае, это может быть двоичный файл!). Предоставляя правильный заголовок типа содержимого, вы формируете правильный запрос, но также позволяете MSW быть уверенным, что req.body
он должен быть проанализирован для объекта.
// your-code.js fetch('https://testlogin.com/api/v1/login', { method: 'POST', headers: { // Adding this header is important so that "req.body" // is parsed into an object in your request handler. 'Content-Type': 'application/json' }, body: JSON.stringify({ login: 'admin@site.com' }) })
// your-handlers.js rest.post('https://testlogin.com/api/v1/login', (req, res, ctx) =gt; { const { login } = req.body if (login !== 'test@example.com') { return res(ctx.status(401), ctx.json({ success: false })) } return res(ctx.json({ success: true })) })
Обратите внимание, как
ctx.status(401)
вызов находится внутриres()
вызова функции. Вызов любыхctx[abc]
методов за пределамиres
не приведет ни к какому эффекту, поскольку они зависят от того, чтобы быть завернутымиres
.