2010-07-15 9 views
19

Also schreibe ich ein paar rspec Tests und ich bin peinlich über meinen Mangel an Ruby Verständnis.Ruby erfordert 'Datei' und relative Position

Ich habe eine Struktur-Datei, die wie folgt aussieht:

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

Wenn ich die Spezifikation für die Datei test_spec.rb ausführen möchte, muss die Datei upload_tool wie folgt enthalten sein:

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

Dann benötigt der upload_tool windows_gui.rb, etwa so:

require '../windows_gui' 

Meine Frage ist, warum so ich windows_gui.rb relativ zu test_spec.rb zu verweisen haben (erfordert die ../) statt die Datei upload_tool.rb? Das fühlt sich falsch an, ich möchte das upload_tool.rb außerhalb des Kontexts der Testspezifikationen verwenden, was bedeutet, dass die Anforderungen jedes Mal geändert werden müssen.

Offensichtlich vermisse ich etwas, aber wenn ich nicht relativ zu der Testspezifikation referenziere, bekomme ich eine Datei nicht gefunden Fehler.

Entschuldigung, dass ich hier so unwissend bin, aber ich komme leer aus. Irgendwelche Gedanken geschätzt.

BB

+2

Fühlen Sie sich nicht schlecht - ich finde den Umgang mit relative Wege eine der ärgerlichsten Dinge über Ruby. Ich habe es in [Was sind die Dinge, die Sie in der Rubin Sprache verbessert werden möchten] aufgeführt (http://stackoverflow.com/questions/855457/what-are-the-things-you-whould-like-improved-in) -the-ruby-language/3261063 # 3261063) –

+0

August 2012 - Beachten Sie, dass dieser Beitrag jetzt zwei Jahre alt ist. Die meisten Leute sind jetzt auf 1.9.2. Siehe diesen Beitrag http://stackoverflow.com/questions/9345412/relative-file-path-in-rspec auch für die beste Lösung (Feb 2012) –

Antwort

20

Sie nicht. require s sind relativ zum aktuellen Verzeichnis, in Ihrem Fall GUI_Tests/Tests. Wenn Sie tun dies statt:

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

Sie würden es verwenden:

require 'windows_gui' # without '../' 

Der häufigste Weg, um dieses Problem zu umgehen, wird mit File.dirname(__FILE__):

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

HINWEIS: in Ruby 1.9.2 erfordert Änderungen seiner Standardwerte: Ruby: require vs require_relative - best practice to workaround running in both Ruby <1.9.2 and >=1.9.2

+1

Perfekt - wie ich schon sagte, ich war peinlich für sogar fragen zu müssen, aber Ich bin froh, dass ich es getan habe. Das macht vollkommen Sinn. –

+19

Tatsächlich ist 'require' * * nicht * relativ zum aktuellen Verzeichnis, es ist relativ zum * Suchpfad * (d. H. Die spezielle Konstante' $ LOAD_PATH' oder ihr Alias ​​'$:'). Es ist einfach so, dass auf älteren Versionen von Ruby (dh alle außer dem noch nicht, aber bald veröffentlichten 1.9.2), das aktuelle Verzeichnis ('.') standardmäßig im Suchpfad ist:' p $ :. include ? ('.') # => wahr '. Ab Ruby 1.9.2 ist dies jedoch nicht mehr der Fall und sollte nicht verlässlich sein. In Ruby 1.9 könnten Sie 'require_relative' verwenden, das relativ zu der Quelldatei funktioniert, von der es aufgerufen wird, anstatt vom Suchpfad. –

+0

@Jorg: Aber wenn ich das in 1.9: '$ :. Ersetze []; require "../ somefile", es funktioniert. – Adrian

Verwandte Themen