1

rspec でトール タスクをテストしたいのですが、rspec からそれらを呼び出す場合、次の 2 つの要件があります。

  1. Thor クラスのインスタンスを利用できるようにしたい
  2. デフォルトのオプションでタスクを呼び出したい(コマンドラインから呼び出されるため)

これらの両方を同時に達成することはできません。次のコードを検討してください。

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"}

最初の 2 つの例では、インスタンスを介してタスクを呼び出すことができますが、既定のオプションはメソッドに渡されません (仕様が非現実的になります)。

3 番目の例では、デフォルトのオプションを取得しますが、クラス インスタンスに期待値を設定することも、テストを困難にするメソッドをスタブ化することもできません。これは、クラス インスタンスがオンザフライで作成されるために発生しています。

4

2 に答える 2

3

thor cli ユーティリティをテストする方法を尋ねられた場合は、この SO answerで提案されているように、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
于 2013-03-23T00:34:20.310 に答える