脊髄反射公的目録
tumblr
アーカイヴ

Guard + RSpec(without Rails) + terminal-notifier-guard で TDD

できること

f:id:yorisilo:20160811180426g:plain

  1. テストを書く
  2. 実装を書く
  3. 自動でテストが走る
  4. そんで,test notification が出てくる (右上のやつ)
  5. 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

ってやると, 今いるディレクトリに .rspecspec/spec_helper.rb ができる.

.rspec

--color
--require spec_helper
  • --color オプションはRSpec実行ログを色付け
  • --require オプションはRSpec実行前に特定のファイルを読み込む

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

生成された Guardfilerails の設定やらいっぱい書いてあるけど全部消して,以下のようにする.

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
  • rspecのグループを定義,監視しているファイルに変更があった場合は bundle exec rspec を実行する.

  • watch メソッド によって監視対象を決める.

  • spec以下のファイルに変更があったとき,lib以下のファイルに変更があったとき,適切なspec以下のファイルを bundle exec rspec に渡し実行するという意味となる.

くわしい構文は次を見よう Guardfile DSL Configuring Guard

homebrew で terminal-notifier を入れる

$ brew install terminal-notifier

terminal-notifier は コマンドから Mac の Notification Center に通知を表示させるためのソフトウェア

terminal-notifierterminal-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 とは

  • Ruby のテストを書くためのDSL

ここを見て 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 より上位に来てるからまあいらないのか.

参考文献

ふぁぼ
jones_millionの今読んでる本