LoginSignup
8
7

More than 5 years have passed since last update.

Thor で作ったサブコマンドを Rspec でテストする

Last updated at Posted at 2016-11-26

Ruby はあんま経験がなくてハマったのでメモ。

Thor を使って Git 風の CLI ツールを作ってるんですが、そのテストでコマンドラインオプションとかパラメータを渡す方法がよくわかんなくて、ぐぐって出てくる方法もなんだかうまくいかなくて、テストでハマってどうすんのよ状態だったんですが、本家のリポジトリにやまほどサンプルがあった。

まず spec_helper.rb に以下のようなメソッドを追加。

RSpec.configure do |config|
  ...
  ...

  def capture(stream)
    begin
      stream = stream.to_s
      eval "$#{stream} = StringIO.new"
      yield
      result = eval("$#{stream}").string
    ensure
      eval("$#{stream} = #{stream.upcase}")
    end

    result
  end
end

このメソッドは標準出力をキャプチャして変数に放り込むためのメソッドです。

Thor のリポジトリから丸パクリしました。

次にテストコードは以下のような感じ。

require 'spec_helper'
require 'oreore/cli'
require "json"

describe Oreore::Command do

  it "Tests for the oreore cli" do
    output = capture(:stdout) { Oreore::Command.start( %w[record get --app=5] ) }
    expect( JSON.parse( output ).count ).to be > 0
  end

end

この場合、oreore record get --app=5 みたいなコマンドを想定したテストをしています。

$ bundle exec rspec

で合格。すっきりした。

あと、コマンドによっては標準エラーを出して死んでもらうケースもあって、そういう場合は以下のような感じ。

  it "Incorrect parameters" do
    expect{
      capture(:stderr) {
        Oreore::Command.start( [
          "record",
          "get"
        ] )
      }
    }.to raise_error( SystemExit )
  end

expect の後のカッコが丸カッコから波カッコにかわるのか。。。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7