在ruby中测试Tempfile的问题

时间:2014-12-04 09:34:39

标签: ruby-on-rails ruby temporary-files

我有一段创建Tempfiles的代码

@tmp_file = Tempfile.new("filename")

我在创作后关闭它们,

@tmp_file.close unless @tmp_file.closed?

当需要向临时文件添加数据时,我打开它们并添加如下数据

   def add_row_to_file(row)
      @tmp_file.open
      @tmp_file.read
      @tmp_file.print(row.to_json + "\n")
    end

一切都很好,但是为了测试同样的情况,我在下面找到了临时文件,当测试用例遇到add_row_to_file(row)

时会产生错误
  buffers = {}

  Tempfile.stub(:new) do |file_name|
    buffer = StringIO.new
    buffers[file_name] = buffer
  end

错误信息是:

Failure/Error: ]],
 NoMethodError:
   private method `open' called for #<StringIO:0x00000010b867c0>

我想在创建时关闭临时文件,因为操作系统级别存在最大临时文件打开问题(我必须处理将大量临时文件上传到S3) 但是为了测试我在访问StringIO的私有方法时遇到了问题。

知道如何解决这个问题吗?感谢。

我有一个解决方法,即在测试环境中跳过关闭StringIO。

@tmp_file.close unless @tmp_file.closed? || Rails.env.test?

并更新add_row_to_file(row),如下所示

   def add_row_to_file(row)
      @tmp_file.open unless Rails.env.test?
      @tmp_file.read unless Rails.env.test?
      @tmp_file.print(row.to_json + "\n")
    end

1 个答案:

答案 0 :(得分:0)

除了在测试中我们想要100%代码覆盖率时提供的解决方案,我们可以尝试以下方法。

如果是StringIO

,请不要关闭流
@tmp_file.close unless @tmp_file.is_a?(StringIO)

所以我们不需要在测试时打开它。

    def add_row_to_file(row)
      @tmp_file = File.open(@tmp_file, 'a+') unless @tmp_file.is_a?(StringIO)
      @tmp_file.print(row.to_json + "\n")
    end

通过这种方式,我们可以在测试环境中实现Tempfile测试而无需实际创建文件,并且在测试时具有100%的代码覆盖率。