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メソッドのスタブ化方法をご存知でしたら教えてください。