RSpec的测试Ruby脚本

问题描述:

说我们有一个红宝石file.rb,如:RSpec的测试Ruby脚本

if __FILE__ == $0 then 
    if ARGV[0] == 'foo' 
    puts "working" 
    # Dir.chdir(../) 
    v = Someclass.new 
    v.do_something 
    end 
end 

它想打印working只有当文件被触发像ruby file.rb foo
我的问题:在rspec中如何测试这种类型的stuf?

我的尝试在下面。该文件运行,但不是在RSpec的测试范围:
Dir expected :chdir with (any args) once, but received it 0 times

it 'should work' do 
    FILE = File.expand_path('file.rb') 
    RUBY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name']) 
    @v = Someclass.new 
    Someclass.should_receive(:new).and_return @v 
    @v.should_receive(:do_something) 

    `#{RUBY} #{FILE} foo` 
end 

反引号运行新的shell,执行命令,返回结果为字符串。这就是为什么它超出了你的范围。反引号并不关心你脚本的内容:ruby,bash或其他东西。

chdir,当然,只适用于这个新的shell,所以似乎没有办法检查你的示例脚本目录更改(跟踪系统调用除外)。也许一些“真正的”脚本会做些什么,输出更多,从而提供更多的可能性来检查它。

+0

对不起,混淆'chdir'只是作为一个例子。编辑我的问题。那么,有可能测试吗? – ted 2012-08-03 11:41:57

+1

这取决于'do_something'方法的作用。反引号是黑匣子,它可以做任何事情,但只输出字符串。如果你有复杂的脚本,并且想用'ruby方式'来测试它,那么最好是将一些代码抽取到库中,然后测试该库。 – 2012-08-03 11:48:56

+0

哪里可以阅读'将一些代码提取到库中? – ted 2012-08-03 11:51:42