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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 105
  • Облачные технологии14 068
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 796
  • Продакт-менеджер1 248

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

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

  • Kubernetes7 761
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 259
  • CI/CD3 240
  • Мониторинг и Observability1 782
  • SRE565
  • Кибербезопасность450

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

  • Data Scientist1 127
  • Бизнес-аналитик925
  • Аналитик данных845
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США43 686
  • Вакансии в Европе23 668
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 889
  • Релокация в США43 686
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

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

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

Как тестировать компоненты Blazor с помощью bUnit?

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

bUnit рендерит Blazor-компоненты в памяти через TestContext, предоставляя API Find/Click/WaitForStateAsync для проверки HTML-вывода и событий; сервисы мокируются через встроенный IServiceCollection, JS Interop — через JSInterop.Setup().

Установка

# В тестовый проект (xUnit или NUnit)
dotnet add package bunit
dotnet add package bunit.web

Что такое bUnit

bUnit — библиотека для unit-тестирования Blazor-компонентов на C#. Она создаёт изолированный TestContext, рендерит компонент в памяти (без браузера), предоставляет API для поиска элементов, триггера событий и проверки HTML-вывода. Аналог Testing Library для React.

Базовый тест компонента

Допустим, есть компонент Counter.razor:

<p>Current count: @Count</p>
<button @onclick="Increment">Click me</button>

@code {
    [Parameter] public int InitialValue { get; set; } = 0;
    private int Count;

    protected override void OnInitialized() => Count = InitialValue;
    private void Increment() => Count++;
}

Тест с bUnit (xUnit):

using Bunit;
using Xunit;

public class CounterTests : TestContext
{
    [Fact]
    public void Counter_StartsAtInitialValue()
    {
        // Arrange + Act
        var cut = RenderComponent<Counter>(p =>
            p.Add(c => c.InitialValue, 5));

        // Assert
        cut.Find("p").TextContent.ShouldContain("Current count: 5");
    }

    [Fact]
    public void Counter_Increments_OnButtonClick()
    {
        var cut = RenderComponent<Counter>();

        cut.Find("button").Click();

        cut.Find("p").TextContent.ShouldContain("Current count: 1");
    }
}

Мокирование сервисов через DI

bUnit наследует TestContext, который содержит Services — стандартный IServiceCollection. Моки регистрируются до рендера:

public class WeatherTests : TestContext
{
    [Fact]
    public async Task WeatherPage_ShowsForecast()
    {
        // Мокируем HttpClient через bUnit helper
        var forecasts = new[] { new WeatherForecast { Summary = "Sunny" } };

        Services.AddSingleton<IWeatherService>(
            Mock.Of<IWeatherService>(s =>
                s.GetForecastAsync() == Task.FromResult(forecasts.AsEnumerable())));

        var cut = RenderComponent<WeatherPage>();

        // Ждём завершения async OnInitializedAsync
        await cut.WaitForElementAsync("table");

        cut.FindAll("td")[0].TextContent.ShouldBe("Sunny");
    }
}

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

[Fact]
public void Child_FiresOnSelected_WhenButtonClicked()
{
    Product? received = null;
    var product = new Product { Id = 1, Name = "Widget" };

    var cut = RenderComponent<ProductCard>(p =>
    {
        p.Add(c => c.Item, product);
        p.Add(c => c.OnSelected, (Product p) => received = p);
    });

    cut.Find("button.select-btn").Click();

    Assert.Equal(product, received);
}

Работа с CascadingValue

[Fact]
public void Component_UsesThemeFromCascading()
{
    var cut = RenderComponent<ThemedButton>(builder =>
        builder.AddCascadingValue(new Theme { Color = "gold" }));

    cut.Find("button").GetAttribute("style").ShouldContain("gold");
}

WaitForState и асинхронные компоненты

[Fact]
public async Task Page_ShowsData_AfterAsync()
{
    var cut = RenderComponent<DataPage>();

    // Ждём пока не появится элемент или не изменится состояние
    await cut.WaitForStateAsync(() =>
        cut.FindAll(".data-row").Count > 0,
        timeout: TimeSpan.FromSeconds(2));

    cut.FindAll(".data-row").Count.ShouldBeGreaterThan(0);
}

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

  • bUnit рендерит в памяти — JS Interop по умолчанию бросает исключение. Нужно зарегистрировать JSInterop.Setup<T>() или использовать JSInterop.SetupVoid() для void-вызовов.
  • WaitForStateAsync и WaitForElementAsync имеют дефолтный таймаут 1 секунда — в медленных CI-окружениях лучше явно указывать больший.
  • Snapshot-тестирование через cut.MarkupMatches() чувствительно к пробелам и атрибутам — используйте MarkupMatches с RegexMatcher или Find/FindAll для точечных проверок.
  • Компоненты с @rendermode (Interactive Server/WASM) в Blazor Web App (.NET 8) не поддерживаются bUnit напрямую — тестируются без render mode аннотации.
  • Если компонент реализует IDisposable, TestContext.DisposeComponents() нужно вызывать явно в Dispose() теста, иначе возможны утечки в параллельных тестах.
  • После Click() Blazor синхронно обрабатывает event — но если handler возвращает Task, нужно await cut.InvokeAsync(() => cut.Find(...).Click()) для корректного завершения.
  • bUnit не эмулирует CSS — тестировать видимость через display:none нельзя, только через @if условия в разметке.

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

  • В чём разница между Blazor Server и Blazor WebAssembly?
  • Что такое Blazor и каковы его основные модели хостинга?
  • Как Blazor управляет повторным рендерингом компонентов и как его оптимизировать?
  • В каких типах frontend-проектов Blazor даёт реальный выигрыш, а где будет избыточен или неудачен?

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

  • Путать component testing с bUnit и Blazor test context с похожим механизмом из другой версии или платформы.
  • Игнорировать runtime-границы Blazor: lifecycle, DI scope, SQL translation, UI thread или platform API.
  • Не обсуждать null/empty/error cases и поведение под нагрузкой.

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

  • Кандидат объясняет component testing с bUnit и Blazor test context на конкретном примере, а не только определением.
  • Указывает последствия для производительности, тестируемости и поддержки.
  • Различает документированное поведение текущего стека и устаревшие практики.

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

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

Источники

  • https://learn.microsoft.com/en-us/aspnet/core/blazor/test

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

Blazorruntime-reasoningtest-design