RSpec モックを使用して、既定の入力をブロックに提供したいと考えています。
ルビー:
class Parser
attr_accessor :extracted
def parse(fname)
File.open(fname).each do |line|
extracted = line if line =~ /^RCS file: (.*),v$/
end
end
end
R仕様:
describe Parser
before do
@parser = Parser.new
@lines = mock("lines")
@lines.stub!(:each)
File.stub!(:open).and_return(@lines)
end
it "should extract a filename into extracted" do
linetext = [ "RCS file: hello,v\n", "bla bla bla\n" ]
# HELP ME HERE ...
# the :each should be fed with 'linetext'
@lines.should_receive(:each)
@parser.should_receive('extracted=')
@parser.parse("somefile.txt")
end
end
フィクスチャされたデータをブロックに渡すことによって、ブロックの内部が正しく機能することをテストする方法です。しかし、RSpec のモック メカニズムを使用して実際にフィードを実行する方法がわかりません。
更新:問題は行テキストではなく、次のものにあったようです:
@parser.should_receive('extracted=')
ルビーコードでそれを self.extracted= に置き換えると、少しは役に立ちますが、どういうわけか間違っているように感じます。