LoginSignup
2
3

More than 5 years have passed since last update.

ごく単純なRSpecを書く

Posted at

RSpecは難しくない

この記事は、Ruby/Railsでプログラミングに入門した人が、はじめてRSpecに触れたときに躓きそうなことについて書いたものです。
はじめてRailsに触れたあとでRSpecのコードを見ると、全然見たことないメソッドばかりで戸惑うと思います。
でも、実際は大して難しいことはやってないのです。コツさえつかめばRSpecは簡単に書けるようになります。

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入門書

使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」

使えるRSpec入門・その2「使用頻度の高いマッチャを使いこなす」

2
3
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
2
3