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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python8 752
  • Облачные технологии6 631
  • QA вакансии2 183
  • Android1 322
  • Инженер данных860
  • Продакт-менеджер316

Разработка

  • iOS1 238
  • Backend вакансии1 196
  • AI вакансии549
  • Fullstack вакансии500
  • Frontend вакансии426
  • Mobile вакансии28

По стеку

  • Go5 209
  • Java3 131
  • Kotlin1 113
  • Node.js1 008
  • Rust833
  • .NET656
  • PHP322
  • C++270
  • C#207

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

  • Kubernetes3 882
  • Linux-инфраструктура2 817
  • DevOps вакансии2 655
  • Terraform / IaC2 191
  • Мониторинг и Observability1 071
  • CI/CD919
  • SRE308
  • Кибербезопасность38

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

  • Аналитик данных522
  • Data Scientist435
  • Бизнес-аналитик397
  • Системный аналитик67

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

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

По регионам

  • Вакансии в США22 951
  • Вакансии в Европе10 259
  • Работа в России2 963
  • Вакансии в Канаде2 034

По формату

  • Удалённые вакансии39 691
  • Релокация в США22 951
  • Гибридная работа3 633
  • Офисная работа2 761

По уровню

  • Senior вакансии19 599
  • Middle вакансии11 130
  • Junior вакансии3 562

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

Все компании
  • Wise192 вакансии
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis42 вакансии
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Phoenix (Elixir)Все вопросы
Phoenix (Elixir)MiddleТеория

Как тестировать LiveView flows с асинхронными событиями, uploads и reconnect сценариями?

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

Phoenix.LiveViewTest позволяет тестировать async handle_info через send/2, загрузки через file_input/render_upload, а reconnect — пересозданием live/2. Все операции синхронизируются автоматически без Process.sleep.

Базовая структура теста

defmodule MyAppWeb.RoomLiveTest do
  use MyAppWeb.ConnCase, async: true
  import Phoenix.LiveViewTest

  test "отображает сообщения", %{conn: conn} do
    {:ok, lv, html} = live(conn, ~p"/rooms/1")
    assert html =~ "Welcome"

    # Симуляция события от пользователя
    lv
    |> form("#message-form", message: %{body: "Hello"})
    |> render_submit()

    assert render(lv) =~ "Hello"
  end
end

Тестирование LiveView: async события, uploads, reconnect

Phoenix LiveView предоставляет Phoenix.LiveViewTest — библиотеку для синхронного тестирования асинхронных LiveView-потоков без реального браузера.

Асинхронные события (handle_info)

Phoenix.LiveViewTest обрабатывает handle_info синхронно при вызове через PubSub из теста. Для прямой отправки используйте send/2:

test "обновляет список при новом сообщении", %{conn: conn} do
  {:ok, lv, _html} = live(conn, ~p"/rooms/1")

  # Симуляция PubSub-события
  send(lv.pid, {:new_message, %{body: "Async message", user: "Alice"}})

  # render/1 ждёт завершения handle_info
  assert render(lv) =~ "Async message"
end

test "broadcast обновляет LiveView", %{conn: conn} do
  {:ok, lv, _html} = live(conn, ~p"/rooms/1")

  # Прямой broadcast через PubSub
  Phoenix.PubSub.broadcast(MyApp.PubSub, "room:1", {:new_message, %{body: "PubSub msg"}})

  assert render(lv) =~ "PubSub msg"
end

Тестирование uploads

file_input/4 симулирует выбор файла; render_upload/3 загружает его:

test "загружает аватар", %{conn: conn} do
  {:ok, lv, _html} = live(conn, ~p"/profile")

  avatar =
    file_input(lv, "#upload-form", :avatar, [
      %{
        last_modified: 1_594_171_879_000,
        name: "my_avatar.jpg",
        content: File.read!("test/fixtures/avatar.jpg"),
        type: "image/jpeg"
      }
    ])

  # Рендерим загрузку (симулирует chunk upload)
  assert render_upload(avatar, "my_avatar.jpg") =~ "100%"

  # Сабмит формы с загруженным файлом
  lv
  |> form("#upload-form")
  |> render_submit()

  assert render(lv) =~ "Avatar updated"
end

test "отклоняет файл превышающий лимит", %{conn: conn} do
  {:ok, lv, _html} = live(conn, ~p"/profile")

  oversized =
    file_input(lv, "#upload-form", :avatar, [
      %{name: "big.jpg", content: :crypto.strong_rand_bytes(10_000_000), type: "image/jpeg"}
    ])

  assert [%{valid?: false, errors: [:too_large]}] = oversized.entries
end

Reconnect сценарии

LiveViewTest позволяет симулировать переподключение через :reconnect:

test "восстанавливает данные после reconnect", %{conn: conn} do
  {:ok, lv, _html} = live(conn, ~p"/dashboard")

  # Обновляем state
  send(lv.pid, {:data_updated, %{count: 42}})
  assert render(lv) =~ "42"

  # Симулируем reconnect — создаёт новый LiveView-процесс
  {:ok, lv2, reconnect_html} = live(conn, ~p"/dashboard")

  # Данные из URL/сессии должны восстановиться
  assert reconnect_html =~ "Dashboard"
end

Тестирование LiveComponent

test "компонент обновляет родительский LiveView", %{conn: conn} do
  {:ok, lv, _html} = live(conn, ~p"/rooms/1")

  # Клик в компоненте
  lv
  |> element("[phx-target][phx-click=\"like\"]", "Like")
  |> render_click()

  assert render(lv) =~ "Liked!"
end

Async assigns (LiveView 0.19+)

test "async assign загружает данные", %{conn: conn} do
  {:ok, lv, _} = live(conn, ~p"/profile/1")

  # Ждём завершения async assign
  assert render(lv) =~ "loading"

  # LiveViewTest автоматически дожидается async операций
  assert render(lv) =~ "User Name"
end

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

  • Process.sleep в тестах. Никогда не используйте Process.sleep для ожидания async операций. render/1 сам синхронизируется с процессом LiveView. Sleep маскирует race conditions.
  • ConnCase vs ChannelCase. LiveView тесты используют ConnCase, не ChannelCase. Смешение приводит к ошибкам подключения.
  • file_input с большими файлами. render_upload загружает весь файл в память теста. Используйте минимальные фикстуры; не копируйте production-файлы в test/fixtures.
  • Навигация между LiveView. Для тестирования live_patch и live_redirect используйте follow_trigger_action/2 или assert_patch/2, не пересоздавайте conn.
  • Shared state в async: true тестах. При async: true убедитесь, что тесты не разделяют глобальный ETS или процессы. Используйте уникальные topic-строки с unique_integer/0.
  • handle_info от внешних систем. Если LiveView подписан на внешний источник (Phoenix.Tracker, Broadway), в тестах изолируйте подписку через mock или тестовые топики.

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

  • Как планировать zero-downtime deploy Phoenix-приложения с Ecto migrations и rolling releases?
  • Что такое Plugs в Phoenix и как работает plug-конвейер?
  • Чем Phoenix отличается от Rails или Django по архитектуре?
  • В чём разница между Phoenix templates (.heex) и традиционными EEx-шаблонами?

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

  • Отвечать определением без production-сценария.
  • Не называть runtime boundary, security boundary или failure mode.
  • Игнорировать версию API, observability и тестовую проверку.

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

  • Объясняет механизм своими словами и без выдуманных API.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

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

Проверить себя по теме Phoenix (Elixir) →

Источники

  • https://hexdocs.pm/phoenix/deployment.html
  • https://hexdocs.pm/phoenix/

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

Phoenix (Elixir)phoenix-productionrisk-analysistechnical-depth