基本ライブラリなのでgem開発をしていると際にデバッグしづらいです。なのでrspecを使ってユニットテストと交互に実装していけば動作確認しながら開発できるので楽です。
というわけで、gem開発時にどうやってrspecを導入するかやってみました。
Ransible
Ansibleをラップしてrubyのコードから簡単に呼び出すためのgemを作っているので、それを例にやっていきます。
https://github.com/harada4atsushi/ransible
.gemspecにrspecを追加します。spec.add_development_dependency
はdevelopmentでのみの依存パッケージなので開発時のみインストールされます。
1 2 3 4 |
spec.add_development_dependency "bundler", "~> 1.6" spec.add_development_dependency "rake" spec.add_development_dependency "rspec" |
続いてRailsでもお馴染みですがspec_helper.rbを作成します。
spec/spec_helper.rb
1 2 |
require 'ransible' |
ちなみにspec_helper.rbに何も記述しないとクラスが読み込まれていないためuninitialized constantエラーになります。
1 2 |
/Users/haradaatsushi/source/ransible/spec/ransible_spec.rb:3:in `<top (required)>': uninitialized constant Ransible (NameError) |
rspecコマンドを実行して結果がちゃんと返ってくればOK
1 2 |
$ rspec |
ただこのままだと非常に読みづらいので、結果に色をつけます。rspec設定ファイルにオプションを記述するとデフォルトで有効になります。
.rspec
1 2 |
--color |
いろいろごにょごにょやりましたが、こんなことやらないでもgem開発時のオプションを指定するだけでこの辺の構造をよしなにやってくれます。
1 2 |
$ bundle gem ransible -t |
テストコード
参考までに実装とテストを載せておきます。
ransible.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
require "ransible/version" module Ransible class Runner def initialize(yml_path, inventory_path) @yml_path = yml_path @inventory_path = inventory_path end def run log = run_ansible p "executed ansible" result = Result.new result.log = log result end private def run_ansible `ansible-playbook -i #{@inventory_path} #{@yml_path}` end end class Result attr_accessor :log end end |
ransible_spec.rb
ansibleを実際に実行しなくてもテストできるように、ansible実行部分をstubしてます。
1 2 3 4 5 6 7 8 9 10 11 |
describe Ransible::Runner do describe "#run" do it do runner = Ransible::Runner.new(nil, nil) runner.stub(:run_ansible).and_return("ansible log") result = runner.run expect(result.log).to eq "ansible log" end end end |
全体の構成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ tree . ├── Gemfile ├── Gemfile.lock ├── LICENSE.txt ├── README.md ├── Rakefile ├── lib │ ├── ransible │ │ └── version.rb │ └── ransible.rb ├── pkg │ └── ransible-0.0.2.gem ├── ransible.gemspec └── spec ├── ransible_spec.rb └── spec_helper.rb |
The following two tabs change content below.

原田 敦
日本CAWのエンジニア。もふもふ部の部長。得意分野はRuby on Railsを使った小規模WEBアプリケーションを高速で開発すること。週末の楽しみは一人お菓子パーティー。三度の飯より小動物をもふもふするのが好きです。

最新記事 by 原田 敦 (全て見る)
- Rails Engineでブログ機能追加するgemを作る - 2015年3月15日
- WEBエンジニア一人だけでサービスを作りきる方法-夫婦のための自動ごはん予定お知らせサービス「GoHaaan」制作でやったこと - 2015年3月7日
- CentOS6でMariaDBのDynamic Columnsを試してみた - 2015年2月28日