我想用rspec测试thor任务,但是当从rspec调用它们时,我有两个要求:
我不能同时实现这两个目标,请考虑以下代码:
require 'thor'
require 'thor/runner'
class App < Thor
method_option :foo , :default => "foovalue"
desc "xlist", "list"
def xlist(search="")
p options
end
end
app = App.new
app.xlist
app.invoke(:xlist)
App.start ARGV产出如下:
> ruby contrib/thor_test.rb xlist
{}
{}
{"foo"=>"foovalue"}在前两个示例中,我可以通过实例调用任务,但默认选项不会传递给方法(这使得规范不切实际)
在第三个例子中,我得到了默认选项,但是我不能对类实例设置期望,也不能对任何使测试困难的方法进行存根。这是因为类实例是动态创建的。
发布于 2013-03-23 00:34:20
如果您询问如何测试thor实用程序,我会阅读这就是答案中建议的thor规范。示例这里特别有用,可以直接使用。
规格:
require 'my_thor'
describe MyThor do
it "should work" do
args = ["command", "--force"]
options = MyThor.start(args)
expect(options).to eq({ "force" => true })
end
end代码:
class MyThor < Thor
desc "command", "do something"
method_option :force, :type => :boolean, :aliases => '-f'
def command
return options
end
end发布于 2015-03-11 17:42:30
我能够通过以下方式提取Thor命令的默认选项:
Thor::Options对象Thor::Options对象解析一个空的选项数组,该数组只返回默认值的散列。代码在下面的get_default_options_for_command中。老实说,我希望有更好的方法,但我找不到。
一旦您有了Thor对象,您就可以替换它的选项,以包含这些默认值,再加上您想要添加的任何其他选项,然后用#xlist运行它。
我使用上面的示例编写了所有这些:
require 'thor'
def get_default_options_for_command(klass,command_name)
option_precursors = klass.all_commands[command_name].options
parser = Thor::Options.new(option_precursors)
parser.parse([])
end
class App < Thor
desc "xlist", "list"
method_option :foo , :default => "foovalue"
method_option :bar
def xlist(search="")
puts "search: #{search}"
puts "options: #{options}"
end
end
app = App.new
xlist_default_opts = get_default_options_for_command(App,'xlist')
new_opts = { :bar => 3 }
app.options = xlist_default_opts.merge(new_opts)
app.xlist('search-term')产出如下:
$ ./test.rb
search: search-term
options: {"foo"=>"foovalue", "bar"=>3}https://stackoverflow.com/questions/13535204
复制相似问题