在下面你可以看到我只调用了一次 File.open
但 rspec 告诉我它收到了 3 次。
def self.import_file(filename)
current_file = filename.split('/').last
destroy_all(["filename = ?",current_file])
unpack_format = "A#{INPUT_FILE_FORMAT.map{|element| element[1]}.join("A")}"
debugger
File.open(filename, 'r').each do |line|
hash_created = create_hash(line, unpack_format).merge({:filename=>current_file})
create(hash_created)
end
end
it "should delete previous records with the same filename" do
Payrec.should_receive(:destroy_all).with(["filename = ?", "testfile.txt"])
File.should_receive(:open).and_return([@file_line])
Payrec.import_file "testfile.txt"
end
输出是
<File (class)> expected :open with (any args) once, but received it 3 times
最佳答案
每个人和他的狗都调用 File.open
。我可以想象它调用的原因有很多:RSpec 读取它的配置文件,Rails 读取它的配置文件,Cucumber 读取它的配置文件,调试器创建一个临时文件,其他东西创建一个临时文件等等。
您应该检查谁正在调用File.open
,在哪里调用发生,什么参数是以及为什么会发生这种情况。
但是,在对核心方法设定期望时,这是您必须处理的事情。
例如,想象一下,您正在 Rubinius 上运行您的规范。在 Rubinius 中,编译器是用 Ruby 编写的。它目前不缓存其编译结果,但肯定可以想象它可以缓存它们,然后自然会使用 File.open
。砰!现在,您的规范会根据您是否达到 JIT 阈值而随机中断。
或者,更糟糕的是:所有 Rubinius 都广泛使用数组和符号来实现几乎所有内容。尝试对那些设定一些期望!
关于ruby-on-rails - 根据 rspec,为什么使用 File.open 调用一次会导致它被调用 3 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2195576/