2012-12-28 39 views
0

我在写一个简单的命令行宝石。如何让阿鲁巴扩展通配符

完成实际工作的库是使用rspec开发的,到目前为止工作正常。

我想要测试命令行部分与阿鲁巴/黄瓜,但我遇到了一些奇怪的行为。

只是为了测试这一点,我已经有了一个二进制文件puts ARGV,和我有测试文件中tmp/aruba

当我运行bundle exec gem_name tmp/aruba/*.*我带有外壳扩展的文件名列表。现在

我的特点文件有:

Given files to work on  # I set up files in tmp/aruba in this step 
When I run `gem_name *.*` # standard step 
Then the output should contain "Wibble" 

最后一步显然是要失败的,但它表明我之间有什么,它预计与实际输出一个差异。我看到的并不是shell扩展文件名列表,而是我所得到的全部是"*.*"

所以我留下了让应用程序按预期工作的位置,但我无法通过测试。我可以采用“”并从那里生成文件列表,但是我正在编写额外的生产代码,以使应用程序在测试中工作 - 我认为这不是正确的方法它。所有这些都是因为壳牌扩张没有发生。

如果你看看我的个人资料,你会发现Ruby不是我的主包,可以随时指向我可能错过的任何资源,但是这只是我缺少一些东西或预期的东西有人知道如何解决的行为?

回答

2

Aruba source小挖后我想出的是,When I run步骤在一个码块这样结束了:

def run!(&block) 
    @process = ChildProcess.build(*shellwords(@cmd)) 
    ... 
    begin 
    @process.start 
    ... 

此外挖掘到ChildProcess结束here

def launch_process 
    ... 
    begin 
    exec(*@args) 
    ... 

而其中存在问题。 exec当参数列表被分成多个阵列元件并不做外壳扩展:

如果EXEC给出一个参数,该参数是 取为线,是受被执行 前壳膨胀。如果给出多个参数,则将第二个和后续参数作为参数传递给没有 shell扩展的命令。

然而,随着shellwords打了一下,我们发现:

Shellwords.shellwords('gem_name *.*') 
=> ["gem_name", "*.*"]     # No good 
Shellwords.shellwords('"gem_name *.*"') 
=> ["gem_name *.*"]      # Aha! 

因此该解决方案可能是简单的:

When I run `"gem_name *.*"` 

如果不工作,那么你很很失败。我建议你手动扩展文件名,因为你不是真的在这里测试shell扩展 - 我们知道这样做:你正在测试多个参数。

因此,你应该做的,而不是:

When I run `gem_name your_file1 your_file2 your_file3` 
+0

感谢挖:)把它放在引号作品不够好。我曾经想过直接传递文件,是的,我没有测试shell扩展,但我希望使用Aruba可以让我以更接近用户输入命令的方式测试命令行。尽管如此,您的解决方法仍然可行。 – Abizern