Help us improve
Share bugs, ideas, or general feedback.
Тестируемость кода — скрытые зависимости, детерминизм, моки. Активируется при сложно тестировать, hard to test, не mockable, скрытая зависимость, DateTime.Now, flaky test, sealed mock, hidden dependency, замокать, test double
How this skill is triggered — by the user, by Claude, or both
Slash command
/dex-skill-testability:testabilityThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Плохо: `DateTime.Now` / `DateTimeOffset.UtcNow` напрямую в бизнес-логике
Share bugs, ideas, or general feedback.
Плохо: DateTime.Now / DateTimeOffset.UtcNow напрямую в бизнес-логике
Правильно: TimeProvider (.NET 8) + FakeTimeProvider в тестах
Почему: тест зависит от реального времени → flaky на CI, нельзя проверить edge cases (DST, конец месяца)
Плохо: var id = Guid.NewGuid() внутри метода → assert на результат невозможен
Правильно: инжекция Func<Guid> или интерфейс IGuidProvider через DI
Почему: каждый запуск возвращает разный ID, тест не может проверить конкретное значение
Плохо: Random.Shared.Next(min, max) внутри логики — результат непредсказуем
Правильно: инжекция seed через конструктор или обёртка IRandomProvider
Почему: тест недетерминирован, воспроизвести падение по seed невозможно
Плохо: Environment.GetEnvironmentVariable("DB_HOST") в сервисе
Правильно: IConfiguration через DI, в тестах IConfiguration с in-memory значениями
Почему: тест зависит от переменных окружения CI/локальной машины → "works on my machine"
Плохо: ConfigHelper.GetSetting("MaxRetries") — статический вызов в бизнес-коде
Правильно: IOptions<RetrySettings> через DI
Почему: невозможно замокать, скрытая зависимость, нельзя переопределить для разных тестовых сценариев
Плохо: File.ReadAllText(path) напрямую в логике → тест требует реальные файлы на диске
Правильно: System.IO.Abstractions — IFileSystem + MockFileSystem в тестах
Почему: тесты зависят от файловой системы хоста, медленные, хрупкие при смене пути
Плохо: new HttpClient() или _httpClient.GetAsync(url) → тест делает реальные HTTP-запросы
Правильно: MockHttpMessageHandler (например, RichardSzalay.MockHttp) или IHttpClientFactory + мок хендлер
Почему: тест зависит от сети и внешнего сервиса → нестабилен, медленен, нельзя проверить error scenarios
Плохо: конструктор делает HTTP-вызов, читает файл, валидирует данные
Правильно: конструктор только сохраняет зависимости; логика инициализации — в отдельный метод InitializeAsync()
Почему: инстанцирование объекта в тесте вызывает побочный эффект — нужны реальные ресурсы даже для unit теста
Плохо: зависимость от sealed class ExternalService — Moq бросит NotSupportedException
Правильно: выдели IExternalService, или оберни в ExternalServiceWrapper : IExternalServiceWrapper
Почему: Moq/NSubstitute не могут создать прокси для sealed класса, тест вынужден использовать реальную реализацию
Плохо: internal class OrderValidator — unit тест из другой сборки не видит класс
Правильно: [assembly: InternalsVisibleTo("MyProject.Tests")] в AssemblyInfo.cs или .csproj
Почему: внутренние классы с нетривиальной логикой важно тестировать напрямую, не только через public API
TimeProvider + FakeTimeProvider, не DateTime.NowFunc<Guid> / IGuidProvider, не Guid.NewGuid() внутриIConfiguration / IOptions<T>, не Environment.GetEnvironmentVariableIFileSystem (System.IO.Abstractions), не File.* напрямуюMockHttpMessageHandler, не реальный HttpClientnpx claudepluginhub dex-it/claude-code-marketplace --plugin dex-skill-testabilityProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.