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是如何实现它们的 顺便说一句,链接打开
和每个
与将块传递给打开
-示例中的文件对象不会自动关闭。顺便说一句,链接打开
和每个
与将块传递给打开
-示例中的文件对象不会自动关闭。顺便说一句,链接打开
和每个
与将块传递给打开
-示例中的文件对象不会自动关闭。顺便说一句,链接打开
和每个
与将块传递给打开
-示例中的文件对象不会自动关闭。