TGViewer
C# Short Posts 🔞 C# Short Posts 🔞 @dimasshortposts · 310 subscribers
Post #6 68
Недавно узнал о полезной фиче в библиотеке Moq. Называется MockRepository. Да, я знаю, что наверное уже почти все о ней слышали, но я вот узнал недавно и делюсь для таких же как я.

В чем суть фичи. Положим у вас есть сервис вот с такими зависимостями:
public NotificationService(
IUsersRepository usersRepository,
ISubscriptionsService subscriptionsService,
IDataBaseService dataBaseService,
IBusSystem busSystem)

Если вы захотите протестировать его, то вам нужно будет мокнуть их все, для чего вы напишете код:

Mock<IUsersRepository> usersRepositoryMock = new Mock<IUsersRepository>();
Mock<ISubscriptionsService> subscriptionsServiceMock = new Mock<ISubscriptionsService>();
Mock<IDataBaseService> dataBaseServiceMock = new Mock<IDataBaseService>();
Mock<IBusSystem> busSystemMock = new Mock<IBusSystem>();

NotificationService sut = new NotificationService(
usersRepositoryMock.Object,
subscriptionsServiceMock.Object,
dataBaseServiceMock.Object,
busSystemMock.Object);


Я жесть как не люблю вот эту часть с объявлением моков, особенно, если учесть, что все из них нужно настраивать. А мне не всегда нужно настраивать их все.

Так вот MockRepository решает эту проблему так:
MockRepository mockRepository = new MockRepository(MockBehavior.Loose);
NotificationService sut = new NotificationService(
mockRepository.Create<IUsersRepository>().Object,
mockRepository.Create<ISubscriptionsService>().Object,
mockRepository.Create<IDataBaseService>().Object,
mockRepository.Create<IBusSystem>().Object);


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

Понятно, что при тестировании это не самая лучшая стратегия, но если вам нужно быстро что-то проверить и написать временный тест, то это будет полезно.

Но чаще я сталкивался с другой проблемой, что я сетапил у мока какой-то метод, а в процессе рефакторинга удалял его использование из кода, а лишний сетап оставался. Так вот с этой проблемой можно справиться вот так:

MockRepository mockRepository = new MockRepository(MockBehavior.Loose);
NotificationService sut = new NotificationService(
mockRepository.Create<IUsersRepository>(MockBehavior.
Strict).Object,
mockRepository.Create<ISubscriptionsService>().Object,
mockRepository.Create<IDataBaseService>().Object,
mockRepository.Create<IBusSystem>().Object);

sut.Notify();

mockRepository.VerifyAll();
mockRepository.VerifyNoOtherCalls();


Два последних метода проверяют следующее - первый смотрит, что все засетапленные методы были вызваны, а второй проверяет, что не было сделано лишних вызовов, кроме тех, что вы провреяете с помощью Verify.

Вот такая вот топовая фича для тестирования!
More from @dimasshortposts
  1. Oct 7, 2026📦ReadyToRun: компилируем свой код заранее В прошлый раз я рассказывал, что методы библиот…
  2. Oct 2, 2026s
  3. Oct 2, 2026Post #503
  4. Sep 30, 2026🛤 Путь до Tier1: от чего он зависит В прошлый раз мы гоняли hello world в цикле и увидели…
  5. Sep 26, 2026🧵 Тредик для вопросов по докладу про MAF на дотнексте В докладе многие подробности опусти…
  6. Sep 23, 2026Даже самым хардкорным ребятам надо отдыхать, так что отдыхаем, мои чюваки 🕺 🧑‍💻dp🥁 #he…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →