Используя new Mock<ObjectWithTimer>()
, ваш код не полностью отделен от реализации этого класса, так как этот метод дает фиктивный класс, производный от вашей конкретной реализации, который (как вы ясно разработали) на самом деле не то, что Вы хотите, чтобы ваши издевательства делали.
Создать интерфейс для ObjectWithTimer
. Интерфейс должен включать все, что является общедоступным об этом классе. Так как класс IDisposable
, ваш интерфейс должен быть производным от этого интерфейса. Измените код, который зависит от этого класса, чтобы он зависел от интерфейса, и измените тест, чтобы смоделировать интерфейс, а не класс.
Теперь, когда вы используете правильный объект Mock, вашему тесту, возможно, потребуется определить, как ожидается, что этот mock будет вести себя. Это нормально при использовании фиктивных объектов, и важно правильно смоделировать поведение, иначе ваш тест будет бесполезным (он может пройти, если реальный код может потерпеть неудачу).
Вызывающий код теперь полностью отделен от реализации этого интерфейса, поэтому больше не имеет значения, как реализован конкретный класс (ObjectWithTimer).