Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 210новых вакансий за сутки·93 612вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 266
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 126
  • Облачные технологии14 083
  • QA вакансии3 456
  • Backend вакансии2 116
  • Инженер данных1 809
  • Продакт-менеджер1 261

Разработка

  • Android1 862
  • iOS1 700
  • Fullstack вакансии990
  • AI вакансии951
  • Frontend вакансии749
  • Mobile вакансии44

По стеку

  • Go8 688
  • Java6 537
  • Node.js2 026
  • .NET1 722
  • Kotlin1 611
  • Rust1 458
  • C#710
  • PHP682
  • C++571

DevOps и инфраструктура

  • Kubernetes7 772
  • DevOps вакансии6 054
  • Linux-инфраструктура5 493
  • Terraform / IaC4 275
  • CI/CD3 239
  • Мониторинг и Observability1 790
  • SRE568
  • Кибербезопасность458

Аналитика и данные

  • Data Scientist1 143
  • Бизнес-аналитик923
  • Аналитик данных857
  • Системный аналитик152

Другие направления

  • Проджект-менеджер620
  • UI/UX дизайн147
  • Ручное тестирование14

По регионам

  • Вакансии в США44 437
  • Вакансии в Европе23 855
  • Вакансии в Канаде4 483
  • Работа в России3 904

По формату

  • Удалённые вакансии75 212
  • Релокация в США44 436
  • Гибридная работа12 388
  • Офисная работа7 083

По уровню

  • Senior вакансии42 625
  • Middle вакансии20 854
  • Junior вакансии6 721

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме tRPCВсе вопросы
tRPCMiddleКодинг

Как тестировать процедуры tRPC? Какие подходы рекомендуются?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Процедуры тестируются через createCallerFactory с подменным контекстом — это быстро и без HTTP. Для интеграционных тестов используют createTRPCMsw или реальный HTTP-сервер на базе Hono/Express.

Подход 1: unit-тесты через createCallerFactory

// server/routers/post.test.ts
import { describe, it, expect, beforeEach } from 'vitest';
import { createCallerFactory } from '../trpc';
import { postRouter } from './post';
import { createMockContext } from '../test-utils';

const createCaller = createCallerFactory(postRouter);

describe('postRouter', () => {
  it('list returns published posts', async () => {
    const ctx = createMockContext({ user: null });
    const caller = createCaller(ctx);

    const posts = await caller.list();
    expect(posts).toBeInstanceOf(Array);
  });

  it('create throws UNAUTHORIZED for guests', async () => {
    const ctx = createMockContext({ user: null });
    const caller = createCaller(ctx);

    await expect(
      caller.create({ title: 'Test', body: 'Content' })
    ).rejects.toMatchObject({ code: 'UNAUTHORIZED' });
  });

  it('create works for authenticated user', async () => {
    const ctx = createMockContext({
      user: { id: 'user-1', name: 'Alice', role: 'USER' },
    });
    const caller = createCaller(ctx);

    const post = await caller.create({ title: 'Hello', body: 'World' });
    expect(post.title).toBe('Hello');
    expect(post.authorId).toBe('user-1');
  });
});

Тестирование tRPC-процедур

В tRPC есть три подхода к тестированию: unit-тесты через caller (быстро, без HTTP), интеграционные тесты через HTTP-адаптер и E2E-тесты с MSW-мокированием клиента.

Фабрика тестовых контекстов

// server/test-utils.ts
import { type Context } from './context';

type MockUser = {
  id: string;
  name: string;
  role: 'USER' | 'ADMIN';
} | null;

export function createMockContext(opts: { user: MockUser }): Context {
  return {
    session: opts.user
      ? { user: opts.user, expires: '2099-01-01' }
      : null,
    db: mockPrismaClient, // используйте prisma-mock или vitest mock
  };
}

Подход 2: интеграционные тесты через HTTP

// server/integration.test.ts
import { createHTTPServer } from '@trpc/server/adapters/standalone';
import { appRouter } from './routers/_app';
import { createTRPCClient, httpBatchLink } from '@trpc/client';
import type { AppRouter } from './routers/_app';

let server: ReturnType<typeof createHTTPServer>;
let client: ReturnType<typeof createTRPCClient<AppRouter>>;

beforeAll(() => {
  server = createHTTPServer({
    router: appRouter,
    createContext: () => ({
      session: { user: { id: 'test-user', role: 'USER' } },
      db,
    }),
  });
  server.listen(0); // случайный порт
  const { port } = server.server.address() as { port: number };

  client = createTRPCClient<AppRouter>({
    links: [
      httpBatchLink({ url: `http://localhost:${port}/trpc` }),
    ],
  });
});

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

it('fetches posts over HTTP', async () => {
  const posts = await client.post.list.query();
  expect(Array.isArray(posts)).toBe(true);
});

Подход 3: мокирование на клиенте через MSW

// __mocks__/trpc.ts  (для тестов React-компонентов)
import { createTRPCMsw } from 'msw-trpc';
import type { AppRouter } from '@/server/routers/_app';

export const trpcMsw = createTRPCMsw<AppRouter>();

// В тесте:
server.use(
  trpcMsw.post.list.query(() => [
    { id: '1', title: 'Mocked Post' },
  ])
);

Подводные камни

  • Middleware не тестируются автоматически через caller: если caller вызывается напрямую с контекстом без пользователя, middleware исполнится и бросит ошибку — это ожидаемо, но нужно явно это тестировать.
  • Мокируйте db-слой, а не процедуры: тесты, мокирующие сами процедуры, ничего не проверяют — мокируйте Prisma/БД.
  • Тип AppRouter на клиенте в тестах: при импорте AppRouter в тесты React убедитесь, что это только type-импорт — иначе серверный код попадёт в тест.
  • Состояние базы данных между тестами: используйте транзакции с откатом или отдельную тестовую БД; не полагайтесь на порядок тестов.
  • TRPCError в caller-е бросается как есть: используйте .rejects.toMatchObject({ code: 'UNAUTHORIZED' }), а не .toThrow().
  • superjson в тестах: если у вас настроен трансформер, убедитесь что тестовый клиент/caller использует тот же трансформер.
  • createCallerFactory не поддерживает subscriptions: для тестирования подписок нужен WebSocket-сервер.

Частые вопросы на собеседовании

  • Чем tRPC отличается от REST и GraphQL? Когда стоит выбрать tRPC вместо них?
  • Как реализовать защищённые процедуры (protected procedures) с помощью middleware и context?
  • Как добавить валидацию входных данных к процедурам tRPC с помощью Zod?
  • В каких типах frontend-проектов tRPC даёт реальный выигрыш, а где будет избыточен или неудачен?

Типичные ошибки

  • Смешивать «тестирование tRPC procedures» с похожим механизмом без критерия выбора.
  • Игнорировать риск: неверно оценить границы применения темы «тестирование tRPC procedures» и получить хрупкое решение.
  • Показывать только синтаксис и не объяснять поведение в runtime или сборке.

Что проверяет интервьюер

  • Объясняет проверка resolver, middleware, validation и authorization без поднятия браузера.
  • Показывает на примере, как работает: обычно тестируют через caller с inner context, отдельно проверяют schema validation и несколько authorization сценариев; e2e поверх HTTP оставляют для интеграции transport и cookies.
  • Называет production-нюанс и граничный случай для темы «тестирование tRPC procedures».

Как вы знаете этот вопрос?

Проверить себя по теме tRPC →

Источники

  • https://trpc.io/docs/server/server-side-calls
  • https://trpc.io/docs/server/context
←Предыдущий вопросЧто такое функция `createCallerFactory` и как она используется для серверных вызовов?Следующий вопрос→Как объединить несколько tRPC-роутеров в один корневой роутер?

Связанные темы

tRPCAPI-testingbackend-testing