- 更新日: 2015年7月21日
- RSpec
RSpec3でTime.nowをスタブ化(stub)
スポンサーリンク
Rails プロジェクトで RSpec 3 でテストコードを書いていて、stub 作成の書き方が RSpec 2 から変わっていました。実装側のコードで使ってある Time.now を RSpec テストコード内でスタブ化したかった。
— 環境 —
Rails 4.1
rspec-rails 3.1.0
【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
スポンサーリンク
RSpec 3 では allow を使って stub 化する
以下のように RSpec テストコードでは、before の中で allow を使ってスタブを作成します。実装側で Time.now が月末日かどうかで判定するコードが書いてあり、それをテストする場合の例です。Time.now が当月の月末日時を返すようにスタブを作りました。
1 2 3 4 5 6 7 8 9 10 |
describe "some test" do before do # Stub for Time.now. Time.now should return end of month. end_of_month = Time.now.end_of_month allow(Time).to receive_message_chain(:now).and_return(end_of_month) end # some test code using Time.now # ... end |
receive_message_chain を使った書き方では、以下のようにメソッドチェインとしても書けるそうです。
1 |
allow(object).to receive_message_chain(:foo, :bar).and_return(something) |
メソッドチェインを使わない場合は、以下のようにも書けるらしい。
1 |
allow(object).to receive(:foo).and_return(something) |
RSpec は基本的に好きなのですけど、バージョンアップでインターフェースが変わりまくるのはちょっと勘弁して欲しい…ですね。RSpec 2 でのスタブの使い方は以下。
- – 参考リンク –
- Rspec3で、TimeオブジェクトのStubをつくろうとしたら作れない
- Ruby – RSpec の should/stub から expect/allow の早見表 – Qiita
- Rspec3のexpectとallowの違い – JanGaJan.com
- Ruby – RSpecでスタブを使う場所はbefore(:each) – Qiita
スポンサーリンク
私は Rails のテストフレームワークには RSpec を使っています。サーバーのテスト用に Serverspec もおすすめです。
<< 前の記事 : RSpecでJSONによるPOSTリクエストをテスト
- RSpec の関連記事
- FactoryGirlをSpringと共に使う時の注意
- 複数モデルのpost :createをテストするRSpecコード(Controller Spec)
- RSpecでJSONによるPOSTリクエストをテスト
- RSpec & Capybara の雑感
- RSpec+Capybaraで同名の複数要素の並び順をテストする
- RSpec3ではrails_helper.rbがrequireされる
- Capybara + Launchy で RSpec テストをブラウザで確認
- CapybaraのwithinをRSpecで使う
- Serverspec(RSpec)のテスト出力に色を付けて見やすくフォーマット
- Serverspec で複数のホストで共通のテストを使い回す
- 2件のコメント
日付系のテストを行う場合は、Timecopがおすすめです。
https://github.com/travisjeffery/timecop
passol さん、こんにちは。便利な gem を教えて頂きありがとうございます!