pepe_la_phew's diary

LL系の話など

RSpecでFile読み込みのテスト

RSpecを使っていて、ファイル読み込みをスタブ化してテストする方法になかなか辿りつけなかったので、残しておく。

テストコード

  describe 'read_foo' do
    it '指定名称のファイルを開き、コメント行以外を云々' do
      lines = <<EOS
#コメント
(ファイルの内容)
EOS
      File.should_receive(:open).with('filename', 'r').and_return(StringIO.new(lines))

      result = Foo.read_foo('filename')
      ...
    end
  end

本体

class Foo
  def self.read_foo(fname)
    File.open(fname, "r").each { |line|
      next if line =~ /^#/
      ...
    }
  end
end

ただし以下のようにopen結果をいったん受けるコードだと、上記テストコードはうまく動作しない。

class Foo
 def self.read_foo(fname)
    File.open(fname, "r") { |file|
      file.each { |line|
        next if line =~ /^#/
        ...
      }
    }
  end
end

…どなたか、ブロックつきopenメソッドのスタブ化方法をご存知でしたら教えてください。