Поделиться через


Тестирование компонентов Razor в ASP.NET Core Blazor

Примечание.

Это не последняя версия этой статьи. В текущем выпуске см. версию этой статьи .NET 9.

Предупреждение

Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущем выпуске см. статью версии .NET 9.

Внимание

Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Для текущего выпуска см. версию этой статьи .NET 9.

Egil Hansen

Тестирование компонентов Razor — важный аспект создания стабильных и поддерживаемых приложений Blazor.

Для тестирования компонента Razor используется тестируемый компонент (CUT):

  • Отображено с соотвествующими входными данными для теста.
  • В зависимости от типа выполняемого теста возможно взаимодействие или изменение. Например, могут активироваться обработчики событий, такие как обработчик событий onclick для нажатия кнопки.
  • Проверка на наличие ожидаемых значений. Тест проходит успешно, когда одно или несколько проверенных значений соответствуют ожидаемым значениям для теста.

Методы тестирования

Два распространенных метода тестирования компонентов Razor — сквозное тестирование (E2E) и модульное тестирование.

  • Модульное тестирование: модульные тесты записываются с помощью библиотеки модульного тестирования, которая предоставляет:

    • рендеринг компонента.
    • проверку выходных данных и состояния компонента;
    • активацию обработчиков событий и методов жизненного цикла;
    • Утверждения, проверяющие, что поведение компонента корректное.

    bUnit — это пример библиотеки, позволяющей выполнять модульное тестирование компонентовRazor.

  • Тестирование E2E: средство выполнения тестов запускает приложение Blazor, содержащее CUT, и автоматизирует экземпляр браузера. Средство тестирования проверяет CUT и взаимодействует с ним через браузер. Playwright для .NET — это пример платформы тестирования E2E, которую можно использовать с приложениями Blazor.

В модульном тестировании участвует только компонент Razor (Razor/C#). Внешние зависимости, такие как службы и взаимодействие программ JS, должны быть замещены модулями для имитации. При тестировании E2E проверяются компонент Razor и вся его вспомогательная инфраструктура, включая CSS, JS и API модели DOM и браузера.

Область тестирования описывает, насколько обширны тесты. Область тестирования обычно влияет на скорость тестов. Модульные тесты запускаются на подмножестве подсистем приложения и обычно выполняются в течение миллисекунд. Тесты E2E, которые проверяют обширную группу подсистем приложения, могут выполняться несколько секунд.

Модульное тестирование также предоставляет доступ к экземпляру CUT, позволяя просматривать и проверять внутреннее состояние компонента. При тестировании E2E обычно это невозможно.

В зависимости от среды компонента тесты E2E должны проверять, что ожидаемое состояние среды достигнуто до начала проверки. В противном случае результат будет непредсказуемым. В модульном тестировании отрисовка CUT и жизненный цикл теста более интегрированы, что повышает стабильность тестирования.

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

В следующей таблице приведены различия между этими двумя методами тестирования.

Возможность Модульное тестирование Тестирование E2E
Область тестирования Только компонент Razor (Razor/C#) Компонент Razor (Razor/C#) с CSS/JS
Время выполнения теста Миллисекунды секунды
Доступ к экземпляру компонента Да Нет
Чувствительность к среде Нет Да
Надежность Более надежное Менее надежное

Выбор наиболее подходящего метода тестирования

Рассмотрим сценарий, когда требуется выбрать тип выполняемого тестирования. Некоторые аспекты описаны в следующей таблице.

Сценарий Рекомендованный метод Замечания
Компонент без логики взаимодействия JS Модульное тестирование Если в компоненте JS отсутствует зависимость от взаимодействия Razor, его можно тестировать без доступа к JS или API модели DOM. В этом сценарии выбор модульного тестирования не имеет никаких недостатков.
Компонент с простой логикой взаимодействия JS Модульное тестирование Чаще всего компоненты запрашивают модель DOM или запускают анимацию с помощью взаимодействия JS. Как правило, в этом сценарии предпочтительным является модульное тестирование, так как довольно просто макетировать взаимодействие JSчерез интерфейс IJSRuntime.
Компонент, зависящий от сложного кода JS Модульное тестирование и раздельное тестирование JS Если компонент использует взаимодействие JS для вызова большой или сложной библиотеки JS, но само взаимодействие между компонентом Razor и библиотекой JS является простым, то, вероятно, лучше всего будет рассматривать компонент и библиотеку JS или код как две отдельные части и тестировать каждую часть индивидуально. Протестируйте компонент Razor с библиотекой модульного тестирования, а библиотеку JS — с библиотекой тестирования JS.
Компонент с логикой, зависящей от действий JS с моделью DOM браузера Тестирование E2E Если функциональность компонента зависит от JS и его действий с моделью DOM, проверяйте код JS и Blazor вместе в тесте E2E. Этот подход разработчики платформы Blazor применили к логике Blazor для отрисовки в браузере, которая использует тесно связанный код на C# и JS. Код C# и JS должны работать совместно для правильного отображения компонентов Razor в браузере.
Компонент, который зависит от сторонней библиотеки классов со сложными для макетирования зависимостями Тестирование E2E Если возможности компонента зависят от сторонней библиотеки классов со сложными для макетирования зависимостями, такими как взаимодействие JS, тестирование E2E может быть единственным вариантом проверить компонент.

Тестирование компонентов с помощью bUnit

Для Blazor отсутствует официальная платформа тестирования Майкрософт, но поддерживаемый сообществом проект bUnit предоставляет удобный способ модульного тестирования компонентов Razor.

Примечание.

bUnit — это сторонняя библиотека тестирования, которая не поддерживается или не обслуживается корпорацией Майкрософт.

bUnit работает с платформами тестирования общего назначения, такими как MSTest, NUnit и xUnit. На этих платформах тестирования тесты bUnit выглядят так же, как обычные модульные тесты. Тесты bUnit, интегрированные с платформой тестирования общего назначения, обычно выполняются с помощью:

Примечание.

Концепции тестирования и реализации тестов в разных платформах тестирования похожи, но не идентичны. Инструкции см. в документации платформы тестирования.

Ниже показана структура теста bUnit для компонента Counter в приложении на основе шаблона проекта Blazor. Компонент Counter отображает счетчик и увеличивает его значение при нажатии пользователем кнопки на странице.

@page "/counter"

<h1>Counter</h1>

<p>Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}

Следующий тест bUnit проверяет правильность увеличения счетчика CUT при нажатии кнопки.

@code {
    [Fact]
    public void CounterShouldIncrementWhenClicked()
    {
        // Arrange
        using var ctx = new TestContext();
        var cut = ctx.Render(@<Counter />);
        var paraElm = cut.Find("p");

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

        // Assert
        var paraElmText = paraElm.TextContent;
        paraElm.MarkupMatches("Current count: 1");
    }
}

Тесты также можно записать в файл класса C#:

public class CounterTests
{
    [Fact]
    public void CounterShouldIncrementWhenClicked()
    {
        // Arrange
        using var ctx = new TestContext();
        var cut = ctx.RenderComponent<Counter>();
        var paraElm = cut.Find("p");

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

        // Assert
        var paraElmText = paraElm.TextContent;
        paraElmText.MarkupMatches("Current count: 1");
    }
}

На каждом шаге теста выполняются следующие действия.

  • Упорядочить: компонент Counter визуализируется с помощью TestContext bUnit. Элемент абзаца CUT (<p>) обнаружен и назначен paraElm. В синтаксисе Razor компонент может быть передан как RenderFragment для bUnit.

  • Act: элемент кнопки <button> находится и выбирается путем вызова Click, который должен увеличивать счетчик и обновлять содержимое тега абзаца <p>. Текстовое содержимое элемента абзаца извлекается путем вызова TextContent.

  • Assert. Для текстового содержимого вызывается метод MarkupMatches, который проверяет его соответствие ожидаемой строке Current count: 1.

Примечание.

Метод MarkupMatches assert отличается от обычного утверждения сравнения строк (например, Assert.Equal("Current count: 1", paraElmText);). MarkupMatches выполняет семантические сравнения входных данных и ожидаемой разметки HTML. Семантическое сравнение учитывает семантику HTML. Это означает, что такие детали, как незначащие пробелы, игнорируются. Это приводит к повышению стабильности тестов. Дополнительные сведения см. в разделе Настройка семантического сравнения HTML.

Дополнительные ресурсы