Перевести тестовые фейки на моки NSubstitute #1

Closed
opened 2026-09-11 20:54:02 +03:00 by rust · 6 comments
Owner

Контекст

Правило владельца (§11 код-стайла): моки — через NSubstitute, новые hand-written фейк-классы не заводить. NSubstitute 6.1.0 уже подключён ко всем тест-проектам, эталон миграции сделан — Support/TestHashers.New() (FakePasswordHasher удалён). Осталось 27 фейков; в скобках — число файлов-потребителей.

Что сделать

  • FakeDiscoveryPacer (1 файл)
  • FakeRatesSource (1)
  • FakeRatesListener (2)
  • FakeTenantRegistry (3)
  • FakeAiTools (4)
  • FakeGlobalSettingsStore (4)
  • FakeTenantProvisioner (5)
  • FakeAiClassifier (5)
  • FakeMlLearningStore (5)
  • FakeRateLimitCounterStore (5)
  • FakeTelegramGateway (5)
  • FakeInviteStore (7)
  • FakeTelegramStore (7)
  • FakeDiscoveryStore (7)
  • FakeTenantRepository (7)
  • FakeSecretCipher (8)
  • FakeFileStorage (9)
  • FakeTenantStore (10)
  • FakeTokenUsageEventStore (10)
  • FakePipelineStore (12)
  • FakeAuditLogStore (13)
  • FakeOperatorAuthStore (14)
  • FakeTenantLimitStore (15)
  • FakeAuthStore (15)
  • FakeMlClient (17)
  • FakeSettingsStore (42)
  • FakeKanjStore (21 файлов, 45 членов — отдельный заход)

Recording*/Harness* (gRPC-харнессы) — оставить: это тестовые хелперы, исключение по §11.

Критерии приёмки

  • сборка 5 решений: 0 предупреждений / 0 ошибок
  • все тесты зелёные, счётчики не упали (1340/130/52/38/9)
  • hand-written фейков не осталось, кроме харнессов-хелперов

Затрагивает

  • тест-проекты core/telegram/ai; прод-код и фронт не трогаем

Источники

  • docs/superpowers/backlog.md (TD-TESTS-NSUBSTITUTE), §11 docs/spec/Код-стайл-Дейл.md
## Контекст Правило владельца (§11 код-стайла): моки — через NSubstitute, новые hand-written фейк-классы не заводить. NSubstitute 6.1.0 уже подключён ко всем тест-проектам, эталон миграции сделан — `Support/TestHashers.New()` (FakePasswordHasher удалён). Осталось 27 фейков; в скобках — число файлов-потребителей. ## Что сделать - [x] FakeDiscoveryPacer (1 файл) - [x] FakeRatesSource (1) - [x] FakeRatesListener (2) - [x] FakeTenantRegistry (3) - [x] FakeAiTools (4) - [x] FakeGlobalSettingsStore (4) - [x] FakeTenantProvisioner (5) - [x] FakeAiClassifier (5) - [x] FakeMlLearningStore (5) - [x] FakeRateLimitCounterStore (5) - [x] FakeTelegramGateway (5) - [x] FakeInviteStore (7) - [x] FakeTelegramStore (7) - [x] FakeDiscoveryStore (7) - [x] FakeTenantRepository (7) - [x] FakeSecretCipher (8) - [x] FakeFileStorage (9) - [x] FakeTenantStore (10) - [x] FakeTokenUsageEventStore (10) - [x] FakePipelineStore (12) - [x] FakeAuditLogStore (13) - [x] FakeOperatorAuthStore (14) - [x] FakeTenantLimitStore (15) - [x] FakeAuthStore (15) - [x] FakeMlClient (17) - [x] FakeSettingsStore (42) - [x] FakeKanjStore (21 файлов, 45 членов — отдельный заход) Recording*/Harness* (gRPC-харнессы) — оставить: это тестовые хелперы, исключение по §11. ## Критерии приёмки - [x] сборка 5 решений: 0 предупреждений / 0 ошибок - [x] все тесты зелёные, счётчики не упали (1340/130/52/38/9) - [x] hand-written фейков не осталось, кроме харнессов-хелперов ## Затрагивает - тест-проекты core/telegram/ai; прод-код и фронт не трогаем ## Источники - `docs/superpowers/backlog.md` (TD-TESTS-NSUBSTITUTE), §11 `docs/spec/Код-стайл-Дейл.md`
rust changed title from Миграция тестовых фейков на NSubstitute (TD-TESTS-NSUBSTITUTE) to Перевести тестовые фейки на моки NSubstitute 2026-09-11 21:21:52 +03:00
Author
Owner

Взято в работу (2026-09-12). Порядок — по чек-листу, от мелких к крупным; по мере миграции фейка — чек-бокс в описании. Верификация после каждого шага: сборка 5 sln + тесты.

Взято в работу (2026-09-12). Порядок — по чек-листу, от мелких к крупным; по мере миграции фейка — чек-бокс в описании. Верификация после каждого шага: сборка 5 sln + тесты.
rust self-assigned this 2026-09-12 00:06:49 +03:00
rust started working 2026-09-12 00:10:21 +03:00
Author
Owner

Готово: FakeDiscoveryPacer, FakeRatesSource, FakeRatesListener (3/27). NSubstitute-конфигурация повторяет семантику фейков, проверки счётчиков заменены на Received/DidNotReceive. Тесты зелёные; единичный фейл TelegramIngressServiceTests — гонка порта харнесса (TD-TEST-HARNESS), не воспроизводится. Дальше — FakeTenantRegistry, FakeAiTools, FakeGlobalSettingsStore.

Готово: FakeDiscoveryPacer, FakeRatesSource, FakeRatesListener (3/27). NSubstitute-конфигурация повторяет семантику фейков, проверки счётчиков заменены на Received/DidNotReceive. Тесты зелёные; единичный фейл TelegramIngressServiceTests — гонка порта харнесса (TD-TEST-HARNESS), не воспроизводится. Дальше — FakeTenantRegistry, FakeAiTools, FakeGlobalSettingsStore.
rust worked for 19 hours 49 minutes 2026-09-12 19:59:51 +03:00
Author
Owner

Прогресс 9/27: + FakeTenantProvisioner (вместе с FailingTenantProvisioner — сценарий сбоя переехал в параметр хелпера) и FakeRateLimitCounterStore. Паттерн для stateful-сторов устоялся: хелпер держит состояние и раздаёт NSubstitute-подставку (.Store/.Classifier), ассерты состояния не меняются. Дальше — FakeTelegramGateway (5), FakeInviteStore (7), FakeTelegramStore (7), FakeDiscoveryStore (7), FakeTenantRepository (7).

Прогресс 9/27: + FakeTenantProvisioner (вместе с FailingTenantProvisioner — сценарий сбоя переехал в параметр хелпера) и FakeRateLimitCounterStore. Паттерн для stateful-сторов устоялся: хелпер держит состояние и раздаёт NSubstitute-подставку (.Store/.Classifier), ассерты состояния не меняются. Дальше — FakeTelegramGateway (5), FakeInviteStore (7), FakeTelegramStore (7), FakeDiscoveryStore (7), FakeTenantRepository (7).
rust was unassigned by stepan 2026-09-12 21:25:47 +03:00
stepan self-assigned this 2026-09-12 21:25:47 +03:00
Owner

11 фейков удалено. Бонусом переехал FakeDiscoveryGateway — он не попал в исходный чек-лист (второй ITelegramGateway с discovery-поверхностью: Search/Info/ReadForEval/Join + NotSupportedException на неожиданных методах). Дальше — пяти-семи-файловые: FakeInviteStore, FakeTelegramStore, FakeDiscoveryStore, FakeTenantRepository.

11 фейков удалено. Бонусом переехал FakeDiscoveryGateway — он не попал в исходный чек-лист (второй ITelegramGateway с discovery-поверхностью: Search/Info/ReadForEval/Join + NotSupportedException на неожиданных методах). Дальше — пяти-семи-файловые: FakeInviteStore, FakeTelegramStore, FakeDiscoveryStore, FakeTenantRepository.
rust added this to the Deal Board project 2026-09-12 23:41:37 +03:00
rust moved this to In Progress in Deal Board on 2026-09-12 23:41:41 +03:00
Owner

Смена окончена (2026-09-13, ночь). Прогресс: 24/27 фейков переведено — пейсер, rates×2, registry,
AiTools, GlobalSettings, AiClassifier, Provisioner+RateLimit, TelegramGateway+DiscoveryGateway, InviteStore,
TelegramStore, DiscoveryStore, SecretCipher, FileStorage, TenantStore, TokenUsageEventStore, PipelineStore,
AuditLogStore, OperatorAuthStore, TenantLimitStore, MlClient, SettingsStore (42 файла!).
Тесты 1340/1340 зелёные, каждый фейк — отдельным коммитом в ветке t1_NSubstitute_tests (HEAD d51d88e).

Осталось: FakeMlLearningStore (5 файлов — начал, отложено в stash из-за 4 красных тестов, починю завтра)
и FakeKanjStore (21 файл, 45 членов — самый крупный). После них — MR в main.

Параллельно завтра: задача #12 (фабрики объектов) — уточнение владельца принято (статичные хэлперы не трогаем).

Смена окончена (2026-09-13, ночь). Прогресс: **24/27 фейков** переведено — пейсер, rates×2, registry, AiTools, GlobalSettings, AiClassifier, Provisioner+RateLimit, TelegramGateway+DiscoveryGateway, InviteStore, TelegramStore, DiscoveryStore, SecretCipher, FileStorage, TenantStore, TokenUsageEventStore, PipelineStore, AuditLogStore, OperatorAuthStore, TenantLimitStore, MlClient, **SettingsStore (42 файла!)**. Тесты 1340/1340 зелёные, каждый фейк — отдельным коммитом в ветке t1_NSubstitute_tests (HEAD d51d88e). Осталось: **FakeMlLearningStore** (5 файлов — начал, отложено в stash из-за 4 красных тестов, починю завтра) и **FakeKanjStore** (21 файл, 45 членов — самый крупный). После них — MR в main. Параллельно завтра: задача #12 (фабрики объектов) — уточнение владельца принято (статичные хэлперы не трогаем).
Owner

MR: #13

MR: https://gitea.khomegeneric.keenetic.pro/rust/Deal/pulls/13
rust moved this to Done in Deal Board on 2026-09-13 03:28:25 +03:00
rust closed this issue 2026-09-13 03:29:32 +03:00
Sign in to join this conversation.