首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在thor任务时使用默认选项

在thor任务时使用默认选项
EN

Stack Overflow用户
提问于 2012-11-23 20:11:39
回答 2查看 1.5K关注 0票数 1

我想用rspec测试thor任务,但是当从rspec调用它们时,我有两个要求:

  1. 我希望有Thor类实例可用
  2. 我想用默认选项调用任务(因为它将从命令行调用)

我不能同时实现这两个目标,请考虑以下代码:

代码语言:javascript
复制
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

产出如下:

代码语言:javascript
复制
> ruby contrib/thor_test.rb xlist
{}
{}
{"foo"=>"foovalue"}

在前两个示例中,我可以通过实例调用任务,但默认选项不会传递给方法(这使得规范不切实际)

在第三个例子中,我得到了默认选项,但是我不能对类实例设置期望,也不能对任何使测试困难的方法进行存根。这是因为类实例是动态创建的。

EN

回答 2

Stack Overflow用户

发布于 2013-03-23 00:34:20

如果您询问如何测试thor实用程序,我会阅读这就是答案中建议的thor规范。示例这里特别有用,可以直接使用。

规格:

代码语言:javascript
复制
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

代码:

代码语言:javascript
复制
class MyThor < Thor
  desc "command", "do something"   
  method_option :force, :type => :boolean, :aliases => '-f'
  def command
    return options
  end
end
票数 3
EN

Stack Overflow用户

发布于 2015-03-11 17:42:30

我能够通过以下方式提取Thor命令的默认选项:

  1. 获取Thor命令选项列表的内部表示形式
  2. 从该命令列表构建Thor::Options对象
  3. 使用该Thor::Options对象解析一个空的选项数组,该数组只返回默认值的散列。

代码在下面的get_default_options_for_command中。老实说,我希望有更好的方法,但我找不到。

一旦您有了Thor对象,您就可以替换它的选项,以包含这些默认值,再加上您想要添加的任何其他选项,然后用#xlist运行它。

我使用上面的示例编写了所有这些:

代码语言:javascript
复制
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')

产出如下:

代码语言:javascript
复制
$ ./test.rb
search: search-term
options: {"foo"=>"foovalue", "bar"=>3}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13535204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档