rspec でブロックを受け取る関数をテストする方法
概要
ブロックを受け入れ、ファイルを開き、yieldして返す関数があります。
def start &block
.....do some stuff
File.open("filename", "w") do |f|
f.write("something")
....do some more stuff
yield
end
end
rspecを使用してテストを作成しようとしています。実際のファイルを開こうとするのではなく、オブジェクト f (私が提供した) をブロックに渡すように File.open をスタブするにはどうすればよいですか?何かのようなもの:
it "should test something" do
myobject = double("File", {'write' => true})
File.should_receive(:open).with(&blk) do |myobject|
f.should_receive(:write)
blk.should_receive(:yield) (or somethig like that)
end
end
解決策
あなたが探しているのは、yield matcher、つまり次のようなものだと思います。
it "should test something" do
# just an example
expect { |b| my_object.start(&b) }.to yield_with_no_args
end