rspec でトール タスクをテストしたいのですが、rspec からそれらを呼び出す場合、次の 2 つの要件があります。
- Thor クラスのインスタンスを利用できるようにしたい
- デフォルトのオプションでタスクを呼び出したい(コマンドラインから呼び出されるため)
これらの両方を同時に達成することはできません。次のコードを検討してください。
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 番目の例では、デフォルトのオプションを取得しますが、クラス インスタンスに期待値を設定することも、テストを困難にするメソッドをスタブ化することもできません。これは、クラス インスタンスがオンザフライで作成されるために発生しています。