2016-03-02 56 views
1

如何模拟/存根,以便我可以测试在each_line内发生了什么?如何模拟/存根文件.open each_line在ruby/rspec

File.open(file_path) do |file| 
    file.each_line do |line| 
    #do something here 
    end 
end 
+0

你在实际做的每一行里面......你可以测试是什么? –

+0

我可以,但我宁愿找到更好的解决方案,并进行更彻底的测试。 – newUserNameHere

+0

我想你应该在测试最终结果时测试实现细节... –

回答

2

尝试是这样的:

RSpec.describe "an example of mock" do 
    let(:content) { StringIO.new("1\n2\n3") } 

    specify do 
    allow(File).to receive(:open).and_yield(content) 
    # do whatever you want 
    end 
end 
+0

刚刚尝试过,这是我得到的:'失败/错误:describe_class.new.process_file(“test”) 要求屈服| [#] |但没有通过任何块' – newUserNameHere

+0

将“期望”更改为“允许”(请参阅​​更新示例)。但它看起来像生产代码的'File.open' – jalkoby

+0

不提供块只是测试下一个代码 '''红宝石 RSpec.describe“的一个例子模拟”做 设(:内容){ StringIO.new(“1 \ n2 \ n3”)} 指定做 允许(File).to接收(:打开).and_yield(内容) File.open('foo'){| f |放f.read} 结束 结束 ''' – jalkoby