2010-07-15 35 views
19

Vì vậy, tôi đang viết một số thử nghiệm rspec và tôi xấu hổ vì thiếu hiểu biết của Ruby.Ruby yêu cầu 'tệp' và vị trí tương đối

Tôi có một cấu trúc tập tin đó trông giống như sau:

  • GUI_Tests/thử nghiệm/test_spec.rb
  • GUI_Tests/windows_gui.rb
  • GUI_Tests/upload_tool.rb

khi tôi chạy spec cho tệp test_spec.rb, tôi yêu cầu tệp upload_tool phải được bao gồm như sau:

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

Sau đó, upload_tool đòi hỏi windows_gui.rb, như vậy:

require '../windows_gui' 

Câu hỏi của tôi là, tại sao nên tôi phải tham khảo tương đối windows_gui.rb để test_spec.rb (yêu cầu ../) chứ không phải là upload_tool.rb? Điều này cảm thấy sai với tôi, tôi sẽ muốn sử dụng upload_tool.rb trong bối cảnh của các thông số thử nghiệm, có nghĩa là thay đổi yêu cầu mỗi lần.

Rõ ràng là tôi đang thiếu thứ gì đó, nhưng nếu tôi không liên quan đến thông số thử nghiệm, tôi sẽ gặp lỗi không tìm thấy tệp.

Xin lỗi vì đã quá ngu dốt ở đây, nhưng tôi sắp hết tay. Bất kỳ suy nghĩ nào được đánh giá cao.

BB

+2

Không cảm thấy xấu - Tôi tìm thấy giao dịch với đường dẫn tương đối là một trong những điều khó chịu nhất về ruby. Tôi đã liệt kê nó trong [những điều bạn muốn cải thiện bằng ngôn ngữ ruby] là gì (http://stackoverflow.com/questions/585457/what-are-the-things-you-would-like-improved-in -e-ruby-language/3261063 # 3261063) –

+0

tháng 8 năm 2012 - Lưu ý rằng bài đăng này hiện đã được hai tuổi. Hầu hết mọi người hiện đang ở trên 1.9.2. Xem bài đăng này http://stackoverflow.com/questions/9345412/relative-file-path-in-rspec cũng để có giải pháp tốt nhất (tháng 2 năm 2012) –

Trả lời

20

Bạn không. require s liên quan đến thư mục hiện tại, trong trường hợp của bạn là GUI_Tests/Tests. Nếu bạn đã làm điều này thay vì:

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

Bạn sẽ phải sử dụng này:

require 'windows_gui' # without '../' 

Cách phổ biến nhất để có được xung quanh vấn đề đó là sử dụng File.dirname(__FILE__):

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

Chú ý: trong Ruby 1.9.2 yêu cầu thay đổi mặc định: Ruby: require vs require_relative - best practice to workaround running in both Ruby <1.9.2 and >=1.9.2

+1

Hoàn hảo - như tôi đã nói, tôi đã xấu hổ vì thậm chí phải hỏi, nhưng Tôi rất vui vì tôi đã làm. Điều đó có ý nghĩa hoàn hảo. –

+19

Thực ra, 'require' là * không * liên quan đến thư mục hiện tại, nó liên quan đến * đường dẫn tìm kiếm * (tức là hằng số đặc biệt' $ LOAD_PATH' hoặc bí danh '$:'). Nó chỉ xảy ra như vậy trên các phiên bản cũ của Ruby (tức là tất cả ngoại trừ phiên bản chưa được phát hành 1.9.2), thư mục hiện tại ('.') nằm trong đường dẫn tìm kiếm theo mặc định:' p $ :. include ? ('.') # => true'. Tuy nhiên, như của Ruby 1.9.2 không còn là trường hợp và không nên dựa vào. Trong Ruby 1.9, bạn có thể sử dụng 'require_relative' hoạt động liên quan đến tệp nguồn mà nó được gọi từ thay vì đường dẫn tìm kiếm. –

+0

@Jorg: Nhưng nếu tôi chạy điều này trong 1,9: '$ :. replace []; yêu cầu '../ somefile'', nó hoạt động. – Adrian

Các vấn đề liên quan