はじめましての人ははじめまして。
たぶん、Fusic社員の中野です。
Advent Calendarに当たってない社員はいるのに、もう2回も当たってしまいました。ルーレットバグってんじゃね?
さて、今回は実際に活用したRSpecのTipsについて書いていこうかと思います。
RSpecはRubyのテスト用フレームワークです。(RSpecを知らない人はごめんなさい。詳しい説明は省きます。)
例えば、こんな感じでテストを書いていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Hoge def run puts foo end def foo; "foo" end end describe Hoge do it "#run" do hoge = Hoge.new hoge.should_receive(:foo).and_return("foo") # 一度だけHoge#fooがコールされるよ hoge.run end end # >> foo # >> . # >> # >> Finished in 0.00048 seconds # >> 1 example, 0 failures |
それでは、Hoge#runの中に無限ループがあるときはどうするのか?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Hoge def run while true do puts foo end end def foo; "foo" end end describe Hoge do it "#run" do hoge = Hoge.new hoge.should_receive(:foo).and_return("foo") hoge.run end end |
もし、これをそのままテストすると、Hoge#runの中の無限ループが実行されて処理が帰ってきません。
無限ループを終わらせる判定があれば、テストは可能なので・・・。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Hoge def run while bar do puts foo end end def foo; "foo" end def bar; true end end describe Hoge do it "#run" do hoge = Hoge.new hoge.stub!(:bar).and_return(true, true, true, false) hoge.should_receive(:foo).exactly(3).times.and_return("foo") hoge.run end end # >> foo # >> foo # >> foo # >> . # >> # >> Finished in 0.00085 seconds # >> 1 example, 0 failures |
という感じにしてあげたら、(擬似的な)無限ループを使ったテストができると思います。
それでは、次の人にバトンタッチ〜。