Я Java-разработчик, играющий с Ruby, и мне это нравится. Я понял, что благодаря метапрограммирующим средствам Ruby мои юнит-тесты стали намного чище, и мне не нужны неприятные рамки для насмешек. У меня есть класс, которому нужны сервисы класса File
, и в моем тесте я не хочу касаться моей настоящей файловой системы. В Java я использовал бы некоторую виртуальную файловую систему для более простых «швов» для передачи поддельных объектов, но в Ruby это явно перебор. То, что я придумаю, кажется уже очень хорошим по сравнению с Java-миром. В тестируемом классе у меня есть необязательный параметр конструктора:
def initialize(file_class=File)
Когда мне нужно открыть файлы в моем классе, я могу сделать это:
@file_class.open(filename)
И вызов переходит либо к реальному File-классу, либо, в случае моего юнит-теста, он идет к поддельному классу, который не касается файловой системы. Я знаю, что должен быть лучший способ сделать это с помощью метапрограммирования?