2010-07-15 16 views
19

Quindi sto scrivendo alcuni test rspec e sono imbarazzato per la mia mancanza di comprensione di Ruby.Ruby richiede 'file' e posizione relativa

Ho una struttura di file che si presenta come le seguenti:

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

quando corro specifica per il file test_spec.rb, richiedo il file upload_tool da includere in questo modo:

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

Poi, l'upload_tool richiede windows_gui.rb, in questo modo:

require '../windows_gui' 

La mia domanda è, perché così devo riferimento relativo alla windows_gui.rb test_spec.rb (che richiede la ../) piuttosto che il upload_tool.rb? Questo mi sembra sbagliato, vorrò usare upload_tool.rb fuori dal contesto delle specifiche del test, il che significa cambiare ogni volta le esigenze.

Chiaramente mi manca qualcosa, ma se non mi riferimento relativo alle specifiche di prova ho ottenere un file non trovato errore.

Siamo spiacenti per essere così ignorante qui, ma sto arrivando a mani vuote. Ogni pensiero è apprezzato.

BB

+2

non sento male - trovo che fare con percorsi relativi una delle cose più fastidiose sul rubino. L'ho elencato in [quali sono le cose che vorresti fossero migliorate nel linguaggio ruby] (http://stackoverflow.com/questions/585457/what-are-the-things-you-would-like-improved-in -la-lingua-rubino/3261063 # 3261063) –

+0

agosto 2012 - Si noti che questo post ha ora due anni. La maggior parte delle persone sono ora 1.9.2. Vedi questo post http://stackoverflow.com/questions/9345412/relative-file-path-in-rspec anche per la soluzione migliore (febbraio 2012) –

risposta

20

Non è così. require s sono relativi alla directory corrente, che nel tuo caso era GUI_Tests/Tests. Se avete fatto questo, invece:

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

Si dovrà utilizzare questo:

require 'windows_gui' # without '../' 

Il modo più comune per aggirare questo problema sta usando File.dirname(__FILE__):

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

NOTA: in rubino 1.9.2 richiedono cambiato è di default: Ruby: require vs require_relative - best practice to workaround running in both Ruby <1.9.2 and >=1.9.2

+1

Perfetto - come ho detto, ero imbarazzato per aver anche dovuto chiedere, ma Sono contento di averlo fatto. Questo ha perfettamente senso. –

+19

In realtà, 'require' è * non * relativo alla directory corrente, è relativo al * percorso di ricerca * (cioè la costante speciale' $ LOAD_PATH' o il suo alias '$:'). Succede che nelle vecchie versioni di Ruby (ovvero tutte tranne 1.9.2 non ancora distribuito), la directory corrente ('.') si trova nel percorso di ricerca per impostazione predefinita:' p $ :. include ? ('.') # => true'. Tuttavia, a partire da Ruby 1.9.2 questo non è più il caso e non dovrebbe essere invocato. In Ruby 1.9, potresti usare 'require_relative', che funziona in relazione al file sorgente da cui è chiamato invece del percorso di ricerca. –

+0

@Jorg: Ma se eseguo questo in 1.9: '$ :. replace []; richiede '../ somefile'', funziona. – Adrian

Problemi correlati