我想使用 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
规格:
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 模拟机制进行实际的馈送。
更新:看起来问题不在于 linetext,而在于:
@parser.should_receive('extracted=')
这不是它的调用方式,在 ruby 代码中用 self.extracted= 替换它有点帮助,但不知何故感觉不对。