В чем суть фичи. Положим у вас есть сервис вот с такими зависимостями:
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.
Вот такая вот топовая фича для тестирования!