gpt4 book ai didi

ruby - RSpec 模拟 :each block

转载 作者:数据小太阳 更新时间:2023-10-29 06:52:36 24 4
gpt4 key购买 nike

我想使用 RSpec 模拟来为 block 提供固定输入。

ruby :

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

这是一种通过将固定数据传递到 block 中来测试 block 内部是否正常工作的方法。但我无法弄清楚如何使用 RSpec 模拟机制进行实际馈送。

更新: 看起来问题不在于行文本,而在于:

@parser.should_receive('extracted=')

这不是它的调用方式,在 ruby​​ 代码中用 self.extracted= 替换它有点帮助,但不知何故感觉不对。

最佳答案

充实“and_yield”的工作原理:我认为“and_return”并不是您真正想要的。这将设置 File.open block 的返回值,而不是生成到其 block 的行。稍微改变一下这个例子,假设你有这个:

ruby

def parse(fname)
lines = []
File.open(fname){ |line| lines << line*2 }
end

R规范

describe Parser do
it 'should yield each line' do
File.stub(:open).and_yield('first').and_yield('second')
parse('nofile.txt').should eq(['firstfirst','secondsecond'])
end
end

会过去的。如果您将该行替换为“and_return”,例如

File.stub(:open).and_return(['first','second'])

它将失败,因为该 block 正在被绕过:

expected: ["firstfirst", "secondsecond"]
got: ["first", "second"]

所以底线是使用“and_yield”来模拟“each”类型 block 的输入。使用“and_return”模拟这些 block 的输出。

关于ruby - RSpec 模拟 :each block,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/378449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com