rspec存根几个File.exists?电话

时间:2014-07-08 08:24:26

标签: ruby rspec

我有几个File.exists的函数?调用:

def create(one_filename, other_filename)
    raise Error, "One error" if File.exists?(one_filename)
    raise Error, "Other error" unless File.exist?(other_filename)
    .....
end

但我不知道如何存根第二个错误。规范是:

it "should not create an existing file" do
    File.stub(:exists?).and_return(true)
    expect {
        subject.create('whatever')
    }.to raise_error("One error")
    end
it "should has to exists the other filename" do
    File.stub(:exists?).and_return(false)
    expect {
        subject.create('whatever.yaml')
    }.to raise_error("Other error")
end

对于第二个规范(it "should has to exists the other filename"),文件是否存在?存根引发第一次检查。

规定两次加注的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

要为多个调用返回多个值,只需执行以下操作:

File.stub(:exists?).and_return(false, true)

或者,最好使用新语法:

Allow(File).to receive(:exists?).and_return(false, true)

另一个选择是根据输入变量来存根方法:

Allow(File).to receive(:exists?).with(one_filename).and_return(false)
Allow(File).to receive(:exists?).with(other_filename).and_return(true)

这具有实际测试行为而非实现的附加价值。

答案 1 :(得分:0)

实际上

模拟对FileUtils或File的调用意味着将测试与实现紧密耦合。

fakefs

只需在存根之前调用以下代码就足够了。

allow(File).to receive(:exist?).and_call_original

source