2011-08-31 59 views
4

我有一个用纯Ruby编写的命令行(NON-RAILS)应用程序,我通过Cucumber和RSpec驱动。它遵循lib,bin,spec和feature目录的典型应用程序层次结构。到目前为止,我已经遵循了编写一个失败的Cucumber特性/场景的传统过程,下降到RSpec驱动出支持的lib文件,然后让场景通过。使用RSpec测试纯Ruby bin/my_app.rb应用程序?

不幸的是,当驱除“bin/my_application.rb”中的主应用程序入口点时,这看起来并不那么简单。我的主要问题是我没有在RSpec中描述一个类,它是一个连续的Ruby脚本,用于管理应用程序的类并通过命令行参数和选项进行初始化。

“bin/my_application.rb”只是一个小的shell执行包装,用于解析命令行选项并将它们作为初始化程序选项传递到我的主应用程序类。我仍然想测试bin脚本的行为(例如MyApp.should_receive(option_a).with(parameter))。

任何建议/想法/建议?这是否是驱除命令行Ruby脚本行为的正常测试策略?

在此先感谢。

回答

4

不确定我完全理解你的问题,但我会说,如果你想使用RSpec来测试你的参数传递,它应该很容易做到。假设你有你的包装脚本:

# my_application.rb 
command = Command.new 
command.foo = true if ARGV[0] 
command.bar = true if ARGV[1] 
command.baz = false if ARGV[2] 

command.make_dollars(1000000) 

只要把它混合起来,使它成为一个适合测试的类。

# command_runner.rb 
class CommandRunner 
    def run(args, command = Command.new) 
    command.foo = true if args[0] 
    command.bar = true if args[1] 
    command.baz = false if args[2] 

    command.make_dollars(1000000) 
    end 
end 

# my_application.rb 
CommandRunner.new.run(ARGV) 

现在你没有进行测试的唯一事情就是在run命令默认参数和文件my_application.rb

希望帮助在一行。 Brandon

+0

在command_runner.rb中不应该是'if args [0]'等等吗? – johnf

+0

糟糕!你是对的。要么工作,但...感谢注意。 – bcarlso