Ruby 如何测试读取文件?

Ruby 如何测试读取文件?,ruby,rspec,Ruby,Rspec,我正在为我的一个类编写一个测试,该类具有以下构造函数: def initialize(filepath) @transactions = [] File.open(filepath).each do |line| next if $. == 1 elements = line.split(/\t/).map { |e| e.strip } transaction = Transaction.new(elements[0], Integer(1

我正在为我的一个类编写一个测试,该类具有以下构造函数:

def initialize(filepath)
    @transactions = [] 
    File.open(filepath).each do |line|
      next if $. == 1
      elements = line.split(/\t/).map { |e| e.strip }
      transaction = Transaction.new(elements[0], Integer(1))
      @transactions << transaction 
    end
end

不幸的是,这失败了,因为我依赖于
$。
在每一行上等于1和增量,并且由于某些原因,这在测试期间没有发生。我怎样才能确保它能做到呢?

全局变量使代码难以测试。您可以使用:

但看起来您正在解析带有标题行的CSV文件。因此,我会使用Ruby的:

需要“csv”
CSV.foreach(文件路径,列sep:“\t”,标题:true,转换器::numeric)do |行|

@事务全局变量使代码难以测试。您可以使用:

但看起来您正在解析带有标题行的CSV文件。因此,我会使用Ruby的:

需要“csv”
CSV.foreach(文件路径,列sep:“\t”,标题:true,转换器::numeric)do |行|

@事务全局变量使代码难以测试。您可以使用:

但看起来您正在解析带有标题行的CSV文件。因此,我会使用Ruby的:

需要“csv”
CSV.foreach(文件路径,列sep:“\t”,标题:true,转换器::numeric)do |行|

@事务全局变量使代码难以测试。您可以使用:

但看起来您正在解析带有标题行的CSV文件。因此,我会使用Ruby的:

需要“csv”
CSV.foreach(文件路径,列sep:“\t”,标题:true,转换器::numeric)do |行|
@交易您可以(也应该)将
IO#每行
可枚举#每行#索引
一起使用,如下所示:

File.open(filepath).each_line.each_with_index do |line, i|
  next if i == 1
  # …
end
或者,您可以删除第一行,然后与其他人一起工作:

File.open(filepath).each_line.drop(1).each do |line|
  # …
end
您可以(也应该)将
IO#每行
Enumerable#每行#带#索引
一起使用,如下所示:

File.open(filepath).each_line.each_with_index do |line, i|
  next if i == 1
  # …
end
或者,您可以删除第一行,然后与其他人一起工作:

File.open(filepath).each_line.drop(1).each do |line|
  # …
end
您可以(也应该)将
IO#每行
Enumerable#每行#带#索引
一起使用,如下所示:

File.open(filepath).each_line.each_with_index do |line, i|
  next if i == 1
  # …
end
或者,您可以删除第一行,然后与其他人一起工作:

File.open(filepath).each_line.drop(1).each do |line|
  # …
end
您可以(也应该)将
IO#每行
Enumerable#每行#带#索引
一起使用,如下所示:

File.open(filepath).each_line.each_with_index do |line, i|
  next if i == 1
  # …
end
或者,您可以删除第一行,然后与其他人一起工作:

File.open(filepath).each_line.drop(1).each do |line|
  # …
end

如果您不想在每次测试中都弄乱模拟
文件
,您可以尝试实现基于StringIO的内存中文件系统,该系统将在测试后自动清理

这样,如果您的实现发生更改,您的测试就不需要更改

require 'fakefs/spec_helpers'

describe "FileReader" do
  include FakeFS::SpecHelpers

  def stub_file file, content
    FileUtils.mkdir_p File.dirname(file)
    File.open( file, 'w' ){|f| f.write( content ); }
  end

  it "should read a file and create transactions" do      
    file_path    = "path/to/file"
    stub_file file_path, "phrase\tvalue\nyo\t2\n"

    filereader = FileReader.new(file_path)
    expect( filereader.transactions ).to_not be_nil
  end
end

请注意:这是Ruby中大多数文件访问的实现,尽可能将其传递回原始方法。如果您正在对文件执行任何高级操作,则可能会在FakeFS实现中遇到bug。我遇到了一些二进制文件字节读/写操作,这些操作并没有在FakeFS中实现,而Ruby是如何实现它们的

如果您不想在每次测试中都弄乱模拟
文件
,您可以尝试实现基于StringIO的内存文件系统,该系统将在测试后自动清理

这样,如果您的实现发生更改,您的测试就不需要更改

require 'fakefs/spec_helpers'

describe "FileReader" do
  include FakeFS::SpecHelpers

  def stub_file file, content
    FileUtils.mkdir_p File.dirname(file)
    File.open( file, 'w' ){|f| f.write( content ); }
  end

  it "should read a file and create transactions" do      
    file_path    = "path/to/file"
    stub_file file_path, "phrase\tvalue\nyo\t2\n"

    filereader = FileReader.new(file_path)
    expect( filereader.transactions ).to_not be_nil
  end
end

请注意:这是Ruby中大多数文件访问的实现,尽可能将其传递回原始方法。如果您正在对文件执行任何高级操作,则可能会在FakeFS实现中遇到bug。我遇到了一些二进制文件字节读/写操作,这些操作并没有在FakeFS中实现,而Ruby是如何实现它们的

如果您不想在每次测试中都弄乱模拟
文件
,您可以尝试实现基于StringIO的内存文件系统,该系统将在测试后自动清理

这样,如果您的实现发生更改,您的测试就不需要更改

require 'fakefs/spec_helpers'

describe "FileReader" do
  include FakeFS::SpecHelpers

  def stub_file file, content
    FileUtils.mkdir_p File.dirname(file)
    File.open( file, 'w' ){|f| f.write( content ); }
  end

  it "should read a file and create transactions" do      
    file_path    = "path/to/file"
    stub_file file_path, "phrase\tvalue\nyo\t2\n"

    filereader = FileReader.new(file_path)
    expect( filereader.transactions ).to_not be_nil
  end
end

请注意:这是Ruby中大多数文件访问的实现,尽可能将其传递回原始方法。如果您正在对文件执行任何高级操作,则可能会在FakeFS实现中遇到bug。我遇到了一些二进制文件字节读/写操作,这些操作并没有在FakeFS中实现,而Ruby是如何实现它们的

如果您不想在每次测试中都弄乱模拟
文件
,您可以尝试实现基于StringIO的内存文件系统,该系统将在测试后自动清理

这样,如果您的实现发生更改,您的测试就不需要更改

require 'fakefs/spec_helpers'

describe "FileReader" do
  include FakeFS::SpecHelpers

  def stub_file file, content
    FileUtils.mkdir_p File.dirname(file)
    File.open( file, 'w' ){|f| f.write( content ); }
  end

  it "should read a file and create transactions" do      
    file_path    = "path/to/file"
    stub_file file_path, "phrase\tvalue\nyo\t2\n"

    filereader = FileReader.new(file_path)
    expect( filereader.transactions ).to_not be_nil
  end
end

请注意:这是Ruby中大多数文件访问的实现,尽可能将其传递回原始方法。如果您正在对文件执行任何高级操作,则可能会在FakeFS实现中遇到bug。我遇到了一些二进制文件字节读/写操作,这些操作并没有在FakeFS中实现,而Ruby是如何实现它们的

顺便说一句,链接
打开
每个
与将块传递给
打开
-示例中的文件对象不会自动关闭。顺便说一句,链接
打开
每个
与将块传递给
打开
-示例中的文件对象不会自动关闭。顺便说一句,链接
打开
每个
与将块传递给
打开
-示例中的文件对象不会自动关闭。顺便说一句,链接
打开
每个
与将块传递给
打开
-示例中的文件对象不会自动关闭。