{ 2010.12.15 }

無限ループのRSpec

    はてなブックマーク - 無限ループのRSpec
    このエントリーをはてなブックマークに追加

    はじめましての人ははじめまして。
    たぶん、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

    という感じにしてあげたら、(擬似的な)無限ループを使ったテストができると思います。

    それでは、次の人にバトンタッチ〜。

    Comments are closed.