- 更新日: 2015年7月21日
- RSpec
RSpec でスタブの使い方
RSpec でスタブ機能を使う際の備忘録。メソッドがまだ未実装ではあるがテスト内で何らかの値を返す必要がある場合や、何かしらの事情でテスト内でメソッドから正常な値を返すことができない場合などに、スタブを使うとテスト内でメソッドが特定の戻り値を返すように設定できます。
【追記 2015/07/21】
RSpec 3 でのスタブ作成については以下をどうぞ。
RSpec3でTime.nowをスタブ化(stub) | EasyRamble
【追記ここまで】
— 環境 —
RSpec 2
RSpec でのスタブの書き方
「オブジェクト#メソッド」が特定のある「戻り値」を返すように設定したい場合、以下のように書く。
1 |
オブジェクト.stub(:メソッド).and_return(戻り値) |
例を見ます。Greeting モデル・コントローラーの Request Spec での例です。
spec/requests/greeting_pages_spec.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
describe "GreetingPages" do let(:user) { FactoryGirl.create(:user) } before do @greetings = ["good morning", "hello", "good night"] end subject { page } describe "index" do before do Greeting.stub(:get_greetings).and_return(@greetings) user.stub(:say_hello).and_return("hello") ... end end ... |
Greeting.get_greetings クラスメソッド、および User#say_hello インスタンスメソッドに対してスタブを使う例です。これらのメソッドが実際にはまだ未実装であっても、テスト内ではそれぞれ特定の戻り値を返すように設定しているので、テストを実行できます。
Greeting.get_greetings クラスメソッドは、@greetings 配列を返します。また、User#say_hello インスタンスメソッドは”hello”を返します。SomeObject.stub(:method).and_return(value) というなんとも直感的で分かりやすい表現です。さすが RSpec。
これで、describe “index” 内のテストでは、Greeting.get_greetings クラスメソッドおよび User#say_greeting インスタンスメソッドを普通に利用できます。簡単で便利です。
- RSpec の関連記事
- FactoryGirlをSpringと共に使う時の注意
- 複数モデルのpost :createをテストするRSpecコード(Controller Spec)
- RSpec3でTime.nowをスタブ化(stub)
- RSpecでJSONによるPOSTリクエストをテスト
- RSpec & Capybara の雑感
- RSpec+Capybaraで同名の複数要素の並び順をテストする
- RSpec3ではrails_helper.rbがrequireされる
- Capybara + Launchy で RSpec テストをブラウザで確認
- CapybaraのwithinをRSpecで使う
- Serverspec(RSpec)のテスト出力に色を付けて見やすくフォーマット
- 初回公開日: 2014年4月2日
Leave Your Message!