Guard + RSpec(without Rails) + terminal-notifier-guard で TDD
できること
- テストを書く
- 実装を書く
- 自動でテストが走る
- そんで,test notification が出てくる (右上のやつ)
- TDD がはかどる!
必要なもの
今回作るもののディレクトリ構成は大体以下のようになってる.
bowling ├── .bundle | └── config ├── Gemfile ├── Guardfile ├── lib │ └── hello.rb ├── spec │ ├── hello_spec.rb │ └── spec_helper.rb └── vendor └── bundle
コマンドは 基本的に bowling
ディレクトリ以下で行う.
まず,Global に bundler を入れておく.
shell
$ gem install bundler
Gemfile を作る
shell
$ bundle init
Gemfile
source "https://rubygems.org" gem "rspec" gem "guard" gem "guard-rspec" gem "terminal-notifier-guard"
gem のインストール (vendor/bundle 以下に)
shell
$ bundle install --path vendor/bundle
これで,.bundle/config
に
--- BUNDLE_PATH: vendor/bundle BUNDLE_DISABLE_SHARED_GEMS: true
こんなのができる.
vendor/bundle
以下にgemを入れていくvendor/bundle
以下のgemしか使わない
という意味である.
以降,入れたいgem があったら,Gemfile
に書きたして,
bundle install
すればおk.
ここから本題
.rspec spec_helper を作る
shell
$ bundle exec rspec --init
ってやると,
今いるディレクトリに .rspec
,spec/spec_helper.rb
ができる.
--color
--require spec_helper
spec_helper
は大仰なのがいっぱい書いてあるけど全部消して以下のようにする
spec/spec_helper.rb
require 'bundler' Bundler.require Dir[File.join(File.dirname(__FILE__), "../lib/**/*.rb")].each { |f| require f }
Guardfile を作る
shell
$ bundle exec guard init rspec
生成された Guardfile
もrails の設定やらいっぱい書いてあるけど全部消して,以下のようにする.
Guardfile
guard :rspec, cmd: 'bundle exec rspec' do watch(%r{^spec/.+_spec\.rb$}) watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" } watch('spec/spec_helper.rb') { "spec" } end
watch メソッド によって監視対象を決める.
spec以下のファイルに変更があったとき,lib以下のファイルに変更があったとき,適切なspec以下のファイルを
bundle exec rspec
に渡し実行するという意味となる.
くわしい構文は次を見よう Guardfile DSL Configuring Guard
homebrew で terminal-notifier を入れる
$ brew install terminal-notifier
terminal-notifier
は コマンドから Mac の Notification Center に通知を表示させるためのソフトウェア
terminal-notifier
と terminal-notifier-guard
を組み合わせれば, guard と Notification Center の連携が簡単にできる.
Guard を走らせる
bundle exec guard
準備は整った!!
TDD する
(設定次第では lib/
以外の場所に実装コードを書いても良いのだけど,)
spec/
にテストコードをlib/
に実装のコードを
バリバリ書いていく.
テストコード例
spec/hello_spec.rb
require 'spec_helper' describe Hello do let(:hello) { Hello.new } it 'should message return hello' do expect(hello.message).to eq 'hello' end end
実装コード例
lib/hello.rb
class Hello def message 'hello' end end
コードを変更し保存するたびに test notification
が出るよ!
Guard とは
- 自動化ツール
- 特定のファイルを監視して,変更があったら,特定の処理を行うやつ.
これを使うことで,ファイルの変更があったら,テストを実行とかできるようになる.
RSpec とは
ここを見て RSpecとは何か
説明
最近の自動テスト環境は auto test ではなく,guard とかを使ってすることが多い.
ナウい構成が
Guard + RSpec(without Rails) (+ terminal-notifier-guard)
というわけである.
思い
普段バイトで,Rails を書いたりしてて,RSpec 便利!って思っていたのだけど,
はて,Rails じゃないものでRSpec使うのってどうやるのだろう...ってなったので,RSpec without Rails な環境を調べてみた.
しかも notification とか出しつつ TDD したかったので,terminal-notifier-guard
を使ってみた.入れるだけで何も設定しなくても使えるので,良い.
これからも Bowling Game Kata で,素振りをやっていきたい. スはスペックのス~RSpecによるテスト駆動開発の実演~ - 角谷信太郎 (2/3)
テストコードや実装コードは RailsじゃないRspec3環境を構築する方法 に書いてある物とほぼ同じです.
大体,参考文献にあることの焼き直しです!
メモ
rbenv のオプションの $ rbenv exec ほげ
っていうのはもう使う機会はないのだろうか,path は/Users/yorisilo/.rbenv/shims
がシステムのruby より上位に来てるからまあいらないのか.