Files
Telegrator/tests/Telegrator.Tests
gutii 0e0a280308 * Added WideBot csproj data
* Added TelegratorWideClient
* Added WClient extension property for handlers
* Code cleanup
2026-04-27 16:28:20 +04:00
..
2026-03-09 13:40:58 +04:00
2026-03-09 03:22:23 +04:00
2026-04-27 16:28:20 +04:00

Тесты для Telegrator

Этот проект содержит комплексные тесты для библиотеки Telegrator, демонстрирующие различные парадигмы и подходы к тестированию.

Структура тестов

1. Filters (Фильтры)

Файл: Filters/FilterTests.cs

Парадигмы тестирования:

  • AAA (Arrange-Act-Assert) - структура теста: подготовка, действие, проверка
  • Given-When-Then - альтернативная формулировка AAA для лучшей читаемости
  • Тестирование граничных случаев и исключений
  • Использование моков для изоляции тестируемого кода
  • Тестирование как позитивных, так и негативных сценариев

Что тестируется:

  • Базовые фильтры (AnyFilter, ReverseFilter, AndFilter, OrFilter)
  • Компиляция фильтров
  • Логические операции между фильтрами
  • Свойства фильтров (IsCollectible)

2. Handlers (Обработчики)

Файл: Handlers/HandlerTests.cs

Парадигмы тестирования:

  • Mocking - создание моков для изоляции зависимостей
  • Dependency Injection - тестирование через интерфейсы
  • Test Doubles - использование заглушек вместо реальных объектов
  • Behavior Verification - проверка поведения, а не только результата
  • Exception Testing - тестирование исключений

Что тестируется:

  • Базовые обработчики обновлений
  • Жизненный цикл обработчиков
  • Обработка исключений
  • Отмена операций
  • Токены жизненного цикла

3. Descriptors (Дескрипторы)

Файл: Descriptors/HandlerDescriptorTests.cs

Парадигмы тестирования:

  • Builder Pattern Testing - тестирование паттерна строителя
  • Factory Pattern Testing - тестирование фабричных методов
  • Immutable Object Testing - тестирование неизменяемых объектов
  • Configuration Testing - тестирование конфигурации объектов
  • Validation Testing - тестирование валидации данных

Что тестируется:

  • Создание дескрипторов обработчиков
  • Различные типы дескрипторов (General, Singleton, Keyed, Implicit)
  • Наборы фильтров
  • Индексаторы
  • Валидация параметров

4. Providers (Провайдеры)

Файл: Providers/ProviderTests.cs

Парадигмы тестирования:

  • Service Layer Testing - тестирование сервисного слоя
  • Integration Testing - тестирование интеграции компонентов
  • Collection Testing - тестирование коллекций и их операций
  • Provider Pattern Testing - тестирование паттерна провайдера
  • Dependency Resolution Testing - тестирование разрешения зависимостей

Что тестируется:

  • Провайдеры обработчиков
  • Коллекции обработчиков
  • Операции с коллекциями
  • Интеграция между провайдерами

5. Hosting (Хостинг)

Файл: Hosting/HostingTests.cs

Парадигмы тестирования:

  • Host Testing - тестирование хостинга приложений
  • Configuration Testing - тестирование конфигурации
  • Dependency Injection Testing - тестирование DI контейнера
  • Builder Pattern Testing - тестирование паттерна строителя
  • Lifecycle Testing - тестирование жизненного цикла приложения

Что тестируется:

  • Строители хостов
  • Конфигурация ботов
  • Жизненный цикл хостов
  • Валидация параметров

6. Collections (Коллекции)

Файл: Collections/CollectionTests.cs

Парадигмы тестирования:

  • Collection Testing - тестирование коллекций и их операций
  • List Testing - тестирование списков
  • Indexing Testing - тестирование индексации
  • Enumeration Testing - тестирование перечисления
  • Capacity Testing - тестирование емкости коллекций

Что тестируется:

  • Списки дескрипторов обработчиков
  • Списки завершенных фильтров
  • Операции с коллекциями
  • Производительность
  • Потокобезопасность

7. Integration (Интеграционные тесты)

Файл: Integration/IntegrationTests.cs

Парадигмы тестирования:

  • Integration Testing - тестирование взаимодействия компонентов
  • End-to-End Testing - тестирование полного потока
  • System Testing - тестирование системы в целом
  • Workflow Testing - тестирование рабочих процессов
  • Scenario Testing - тестирование сценариев использования

Что тестируется:

  • Полный цикл обработки обновлений
  • Взаимодействие фильтров и обработчиков
  • Композиция фильтров
  • Жизненный цикл обработчиков
  • Интеграция компонентов

8. TestHelpers (Вспомогательные утилиты)

Файл: TestHelpers/TestUtilities.cs

Парадигмы тестирования:

  • Test Utilities - создание вспомогательных методов для тестов
  • Test Data Builders - построители тестовых данных
  • Mock Factories - фабрики моков
  • Test Fixtures - фикстуры для тестов
  • Test Helpers - вспомогательные классы для тестирования

Что предоставляется:

  • Утилиты для создания тестовых данных
  • Фабрики моков
  • Вспомогательные классы
  • Тестовые обработчики

Основные принципы тестирования

1. AAA (Arrange-Act-Assert)

[Fact]
public void TestExample()
{
    // Arrange - подготовка тестовых данных
    var filter = Filter<Update>.Any();
    var context = TestUtilities.CreateFilterContext();

    // Act - выполнение тестируемого действия
    var result = filter.CanPass(context);

    // Assert - проверка результата
    result.Should().BeTrue();
}

2. Тестирование граничных случаев

[Theory]
[InlineData(-1)]
[InlineData(1)]
[InlineData(100)]
public void TestBoundaryConditions(int invalidIndex)
{
    // Тестируем граничные случаи
}

3. Использование моков

[Fact]
public void TestWithMocks()
{
    // Arrange
    var mockClient = new Mock<ITelegramBotClient>();
    var mockContainer = TestUtilities.CreateMockHandlerContainer();

    // Act & Assert
    // Тестирование с моками
}

4. Тестирование исключений

[Fact]
public void TestExceptions()
{
    // Act & Assert
    Action action = () => { /* код, который должен выбросить исключение */ };
    action.Should().Throw<ArgumentException>();
}

Запуск тестов

Через командную строку

dotnet test

Через Visual Studio

  1. Откройте Test Explorer
  2. Запустите все тесты или выберите конкретные

Через Rider

  1. Откройте Unit Tests window
  2. Запустите тесты

Покрытие кода

Для анализа покрытия кода используйте:

dotnet test --collect:"XPlat Code Coverage"

Рекомендации по написанию тестов

  1. Именование тестов должно быть описательным и следовать паттерну MethodName_Scenario_ExpectedResult
  2. Каждый тест должен тестировать только одну вещь
  3. Используйте моки для изоляции зависимостей
  4. Тестируйте как позитивные, так и негативные сценарии
  5. Группируйте связанные тесты в отдельные классы
  6. Используйте вспомогательные методы для создания тестовых данных
  7. Документируйте сложные тесты с помощью комментариев

Полезные ссылки