Pull to refresh

Comments 4

Недавно я понял, что проблема с моками и стабами заключается в том, что они нарушают инкапсуляцию.

Как - то отсутствует объяснение того, почему соблюдение инкапсуляции в тестах - это ценность.

Потому что тогда тесты тестируют детали реализации, а не внешне поведение и контракты в целом.

Созданное значение должно быть равно полученному
Если подвергнуть динамический мок тому же тесту, как он себя поведёт?

Такой тест может быть только интеграционным. Похоже, автор совершенно не разбирается в вопросе.

var sut = new Mock<IReservationsRepository>().Object;
 
await sut.Create(restaurantId, expected);
var actual = await sut.ReadReservation(restaurantId, expected.Id);

В юнит-тестах мокать нужно зависимости тестируемого юнита, а автор тут мокает сам юнит.

var sut = new FakeDatabase();
 
await sut.Create(restaurantId, expected);
var actual = await sut.ReadReservation(restaurantId, expected.Id);

"Классы SqlReservationsRepository и FakeDatabase ведут себя в соответствии с контрактом"

Прохождение теста с FakeDatabase никак не гарантирует, что SqlReservationsRepository будет работать так же. Тестирование фейков тут ничем не отличается от тестирования моков, этот тест не имеет смысла.

var sut = new ReservationsController();
await sut.Post(expected.ToDto());

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

а что тут вообще происходит? зачем автор тестирует мок объект? мок должен лишь притвориться настоящим, а тестировать нужно то, что потребляет объекты с этим интерфейсом. а в каком месте тесты нарушают инкапсуляцию? с каких это пор инъекция зависимостей - это нарушение инкапсуляции?

Sign up to leave a comment.