ruby-on-rails - 根据 rspec,为什么使用 File.open 调用一次会导致它被调用 3 次

标签 ruby-on-rails ruby file rspec

在下面你可以看到我只调用了一次 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/

相关文章:

ruby - 使用自定义环境运行命令行

ruby - 如何使用 gsub 提取 youtube 视频的 ID?

java - 试图读取文件

ruby-on-rails - ruby rails : retrieve form input field's id

ruby-on-rails - 如何指定私有(private)方法

ruby-on-rails - rspec assert_equal 没有方法错误

ruby-on-rails - 如何限制 current_user 每个时间段向订单添加超过 3 个 order_items?

ruby-on-rails - 如何正确设置 Active Paypal Adaptive Payment IPN Notifications?

php - 将文件作为 varbinary 数据类型插入 mysql 数据库

python - 将字典列表保存到文件python 3