2010-07-15 31 views
19

所以我正在写一些rspec测试,我很尴尬,因为我缺乏对Ruby的理解。红宝石需要'文件'和相对位置

我有一个文件结构如下所示:

  • GUI_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

不要感觉不好 - 我觉得处理相对路径是关于ruby最讨厌的事情之一。我已经列出它[你想在红宝石语言中改进的东西](http://stackoverflow.com/questions/585457/what-are-the-things-you-would-like-improved-in -ruby-language/3261063#3261063) – 2010-07-16 00:24:41

+0

2012年8月 - 请注意,这篇文章现在已经两岁了。现在大多数人都在1.9.2上。看到这篇文章http://stackoverflow.com/questions/9345412/relative-file-path-in-rspec也为最好的解决方案(2012年2月) – 2012-08-26 14:20:59

回答

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') 

注意:红宝石1.9.2需要改变它的默认值:Ruby: require vs require_relative - best practice to workaround running in both Ruby <1.9.2 and >=1.9.2

+1

完美 - 就像我说的,我甚至不得不问,但尴尬,但我很高兴我做到了。这很有道理。 – 2010-07-15 17:51:13

+19

实际上,'require'不是*相对于当前目录,而是相对于*搜索路径*(即特殊常量'$ LOAD_PATH'或其别名$:')。刚刚发布的旧版本的Ruby(即除了尚未发行但即将发布的1.9.2版本之外的所有版本),当前目录('.')默认位于搜索路径中:'p $ :. include ?('。')#=> true'。但是,从Ruby 1.9.2开始不再是这种情况,不应该依赖它。在Ruby 1.9中,您可以使用'require_relative',它相对于从中调用的源文件而不是搜索路径。 – 2010-07-15 18:10:54

+0

@Jorg:但是如果我在1.9中运行这个:'$ :. replace [];需要'../ somefile',它工作。 – Adrian 2010-07-15 18:56:37