Я все еще нахожусь в стадии обучения в отношении юнит-тестирования и, в частности, в отношении насмешек (я использую платформы PascalMock и DUnit ).Одна вещь, на которую я сейчас наткнулся, заключалась в том, что я не смог найти способ жестко запрограммировать детали реализации тестируемого класса / интерфейса в моем модульном тесте, и это просто неправильно ...
Например: я хочупротестировать класс, который реализует очень простой интерфейс для чтения и записи настроек приложения (в основном, пары имя / значение).Интерфейс, представляемый потребителю, совершенно не зависит от того, где и как на самом деле хранятся значения (например, реестр, INI-файл, XML, база данных и т. Д.).Естественно, уровень доступа реализован еще одним классом, который внедряется в тестируемый класс при создании.Я создал фиктивный объект для этого уровня доступа, и теперь я могу полностью протестировать класс, реализующий интерфейс, фактически не читая и не записывая что-либо в любой реестр / INI-файл / что угодно.
Однако, чтобы гарантироватьmock ведет себя точно так же, как реальная вещь, когда к нему обращается тестируемый класс, мои модульные тесты должны устанавливать фиктивный объект, очень явно определяя ожидаемые вызовы методов и возвращаемые значения, ожидаемые тестируемым классом.Это означает, что если мне когда-либо придется вносить изменения в интерфейс уровня доступа или в способ, которым тестируемый класс использует этот уровень, мне также придется изменить модульные тесты для класса, который внутренне использует этот интерфейс, даже если интерфейс класса, который я тестирую, практически не изменился.Это то, с чем мне придется смириться при использовании mocks, или есть лучший способ создать зависимости класса, чтобы этого избежать?