2010-07-15 6 views
19

Итак, я пишу некоторые тесты rspec, и я смущен отсутствием понимания Ruby.Ruby требует «файл» и относительное местоположение

У меня есть файл структуру, которая выглядит следующим образом:

  • GUI_Tests/Tests/test_spec.rb
  • GUI_Tests/windows_gui.rb
  • GUI_Tests/upload_tool.rb

когда я запускаю спецификацию для файла test_spec.rb, мне нужно, чтобы файл upload_tool включался так:

spec -r ../upload_tool -fs test_spec.rb 

Затем upload_tool требует windows_gui.rb, например, так:

require '../windows_gui' 

Мой вопрос, почему так я должен ссылаться windows_gui.rb относительно test_spec.rb (требующие ../), а не upload_tool.rb? Это мне не нравится, я хочу использовать upload_tool.rb из контекста тестовых спецификаций, что означает, что каждый раз требуется изменение.

Очевидно, что у меня что-то не хватает, но если я не ссылаюсь на тестовую спецификацию, я получаю файл, который не найден.

Извините за то, что вы так невежественны здесь, но я подхожу с пустыми руками. Любые мысли оценили.

BB

+2

Не чувствую себя плохо - я нахожу работу с относительные пути - одна из самых раздражающих вещей о рубине. Я перечислил его в [то, что вы хотели бы улучшить на рубиновом языке] (http://stackoverflow.com/questions/585457/what-are-the-things-you-would-like-improved-in -the-ruby-language/3261063 # 3261063) –

+0

Август 2012 г. - Обратите внимание, что этому сообщению сейчас два года. Большинство людей сейчас находятся на 1.9.2. См. Это сообщение http://stackoverflow.com/questions/9345412/relative-file-path-in-rspec также для лучшего решения (февраль 2012 г.) –

ответ

20

У вас нет. require s относятся к текущему каталогу, который в вашем случае был GUI_Tests/Tests. Если вы сделали это вместо:

cd .. 
spec -r upload_tool -fs Test/test_spec.rb 

Вы бы использовать это:

require 'windows_gui' # without '../' 

Самый распространенный способ обойти эту проблему использует File.dirname(__FILE__):

require File.join(File.dirname(__FILE__), '..', 'windows_gui') 

Примечание: в Ruby 1.9.2 требуют изменения по умолчанию: Ruby: require vs require_relative - best practice to workaround running in both Ruby <1.9.2 and >=1.9.2

+1

Идеально - как я уже сказал, мне было стыдно за то, что я даже спросила, но Я рад, что сделал. Это имеет смысл. –

+19

Собственно, 'require' is * not * относительно текущего каталога, это относительно * пути поиска * (то есть специальной константы' $ LOAD_PATH' или ее псевдонима '$:'). Так получилось, что в старых версиях Ruby (т. Е. Все, кроме еще не выпущенного, но скоро выпущенного 1.9.2) текущий каталог ('.') по умолчанию находится в пути поиска:' p $ :. include ? ('.') # => true'. Однако с Ruby 1.9.2 это уже не так, и на него нельзя положиться. В Ruby 1.9 вы можете использовать 'require_relative', который работает относительно исходного файла, из которого он вызывается, а не из пути поиска. –

+0

@Jorg: Но если я запустил это в 1.9: '$ :. replace []; require '../ somefile'', он работает. – Adrian