RSpecは難しくない
この記事は、Ruby/Railsでプログラミングに入門した人が、はじめてRSpecに触れたときに躓きそうなことについて書いたものです。
はじめてRailsに触れたあとでRSpecのコードを見ると、全然見たことないメソッドばかりで戸惑うと思います。
でも、実際は大して難しいことはやってないのです。コツさえつかめばRSpecは簡単に書けるようになります。
- 重要なのは it と expect
- describeは「何のクラスの」「何のメソッドについてのテスト」という目印
- eqはマッチャと呼ばれるもの
- contextって何、describeと何か違うの?
- 参考図書
RSpecにはRuby/Railsにはない独特なメソッドが沢山ありますが、殆どはテストを効率よく、きれいに書くための道具で、使わなくてもテストはできます。
まずは最低限の道具だけ使って、OreOreモデルのクラスメソッドhogehogeについてのspecを書く想定でちょっと書いてみます。
### OreOreモデル。app/models/ore_ore.rb
class OreOre < ActiveRecord::Base
class << self
def hogehoge
:foobar
end
end
end
### OreOreモデルについてのテスト。spec/models/ore_ore_spec.rb
describe OreOre do
### hogehogeメソッドについて検証する
describe'hogehoge' do
### OreOre.hogehogeするとfoobarが返ってくる
it 'foobarが返ってくること' do
### 返して欲しい値を定義
kitaichi = :foobar
### メソッド叩いた返り値を取得
ret = OreOre.hogehoge
### 期待値とメソッド叩いた返り値を取得を比較
expect(ret).to eq(kitaichi)
end
end
end
OreOre.hogehogeの実装を見ると自明ですが、テストも成功します
重要なのは it と expect
RSpecのテストは、
itブロックの中に書くexpect文で、期待値とテストが生成した値の比較し、想定どおりの結果が得られたかどうか
というだけのこと。
上記の例で言うと、
expect(ret).to eq(kitaichi)
は、retとkitaichiがeq(等しいか?)というテスト。
例えば
expect(ret.class).to eq(Symbol)
と書けば、返り値がSymbolであることを確認するテストにできるし(ちょっと何がしたいのかわかりませんが)
expect(ret.length).to eq(6)
なら、返り値のlengthを確認するテストにもできます(ちょっと何がしたいのかわかりませんが)
※説明のためにkitaichiとかretとかのローカル変数にわざわざ代入してますが、ローカル変数を使う必要はなく、
↓↓の書き方で十分です。
expect(OreOre.hogehoge).to eq(:foobar)
ただ、説明変数使ったほうが読みやすくて良い場合が多いと思います。
describeは「何のクラスのテスト」とか、「何のメソッドについてのテスト」という目印。
「何のテストですよ」というくくりの目印
見てのとおりdo~endで囲われたブロックです。
eqはマッチャと呼ばれるもの。
とりあえずeqだけ覚えておけばテストは書けますが、 eq(等しいか?)以外にも便利なものが沢山あるので、調べると便利。
使えるRSpec入門・その2「使用頻度の高いマッチャを使いこなす」
contextって何、describeと何か違うの?
文脈で使い分けるとよいとされていますが機能は同じです。
context は describe のエイリアスでしかありませんが使う目的が違います。
ひとことで言うなら、 describe はテストする対象をあらわし、 context はテストする時の状況をあらわします。
参考図書
Everyday Rails - RSpecによるRailsテスト入門
この本は私が知る限り最高のRSpec入門書