Как условно имитировать ответы на ошибки с помощью msw

Пользовательский интерфейс, над которым я работаю, отображается по-разному в зависимости от полученного ответа. Я хотел бы протестировать пользовательский интерфейс, когда будут получены ответы и.

Мой обработчик api выглядит примерно так:

      import { rest } from 'msw';
import { items } from './apiValues';

export const handlers = [
  rest.get('/items/', (_req, res, ctx) => res(ctx.status(200), ctx.json(items))),
];

Это всегда будет возвращать 2xx response, из-за чего он не может протестировать пользовательский интерфейс, если получен ответ или, если я не изменю обработчики вручную, что утомительно.

Как можно проводить тесты на 4xx а также 5xx отзывы проверять?

2 ответа

Если вы не хотите возиться с параметрами запроса, вы также можете использовать.use()функция.

  1. Где бы вы ни настраивали свои обработчики, добавляйте еще один массив для каждого условия, которое вы хотите проверить.
      export const errorHandlers = [
  rest.get('/items/', (_req, res, ctx) => res(ctx.status(500), ctx.json(null))),
];
  1. В тестовом файле импортируйте обработчики и сервер msw, которые вы настроили, а затем внутри теста распространите обработчики на экземпляр сервера, который вы хотите использовать.
      import { errorHandlers } from './handlers'
import { mswServer } from 'setupTests'

test('handles errors', () => {
  mswServer.use(...errorHandlers)
  // ...the rest of your test  
})

Используйте параметры поиска, чтобы контролировать свой ответ для get запрос.

Передайте переменную в req.body чтобы контролировать, будет ли ответ успешным или нет для post запрос.

См. Условный ответ

      import { setupWorker, rest } from 'msw';

const worker = setupWorker(
  rest.get('/items/', (req, res, ctx) => {
    const error = req.url.searchParams.get('error')
     
    // error response
    if(error === 'network') {
      return res(
        ctx.status(200),
        ctx.json({
          errorMessage: 'Network error',
        }),
      )
    }

    // successful response
    return res(ctx.status(200), ctx.json(items));
  }),
)
Другие вопросы по тегам