Она замечательна тем, что позволяет существенно упростить хранение и доступ к тестовым данным, если они должны находиться в отдельном файле.
Допустим, пишешь класс - обработчик каких-то особенных файлов данных. Написал тест, файл с тестовыми данными, затем библиотеку (или в другом порядке). Удобно иметь библиотеку, тест и данные в одном файле. Здесь выручит директива __END__
Как она работает? Весь текст в файле после этой директивы становится доступен как содержимое объекта с именем DATA класса IO (файл). Он уже открыт, его можно читать. В простейшем виде получается так:
puts DATA.read
__END__тут уже пошло содержимое объекта DATAвторая строка этого содержимого и т.д.
Тестовый код можно прикрепить при помощи конструкции if __FILE__ == $0
module MyModule
class MyClass
def test_process_io io
puts io.read
end
end
end
if __FILE__ == $0
# код выполняется когда выполнен запуск ruby название_файла_этого_сценария.rb
# а когда сенарий просто подключается require - не выполняется
# сюда удобно помещать тестовый код
MyModule::MyClass.new.test_process_io DATA
end
# а сюда удобно помещать тестовые данные
__END__
the first line is to be read from DATA IO
the second line is to be read from DATA IO
...
class MyClass
def test_process_io io
puts io.read
end
end
end
if __FILE__ == $0
# код выполняется когда выполнен запуск ruby название_файла_этого_сценария.rb
# а когда сенарий просто подключается require - не выполняется
# сюда удобно помещать тестовый код
MyModule::MyClass.new.test_process_io DATA
end
# а сюда удобно помещать тестовые данные
__END__
the first line is to be read from DATA IO
the second line is to be read from DATA IO
...
Комментариев нет:
Отправить комментарий