我有一段创建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
答案 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%的代码覆盖率。