class Test::Unit::Data::ClassMethods::Loader

公共类方法

new(test_case) 点击切换源代码

@api private

# File test-unit-3.6.7/lib/test/unit/data.rb, line 206
def initialize(test_case)
  @test_case = test_case
end

公共实例方法

load(file_name) 点击切换源代码

从文件加载数据。

@param [String] file_name 测试数据文件的完整路径。

File format is automatically detected from filename extension.

@raise [ArgumentError] 如果 ‘file_name’ 不是支持的文件格式。 @see load_csv @see load_tsv @api private

# File test-unit-3.6.7/lib/test/unit/data.rb, line 218
def load(file_name)
  case File.extname(file_name).downcase
  when ".csv"
    load_csv(file_name)
  when ".tsv"
    load_tsv(file_name)
  else
    raise ArgumentError, "unsupported file format: <#{file_name}>"
  end
end
load_csv(file_name) 点击切换源代码

从 CSV 文件加载数据。

CSV 文件有两种类型,如下面的示例所示。第一种,第一行有标题,并且它的第一列是 “label”。另一种,文件中没有标题。

@example 从带有标题的 CSV 文件加载数据

# test-data.csv:
#  label,expected,target
#  empty string,true,""
#  plain string,false,hello
#
load_data("/path/to/test-data.csv")
def test_empty?(data)
  assert_equal(data["expected"], data["target"].empty?)
end

@example 从没有标题的 CSV 文件加载数据

# test-data-without-header.csv:
#  empty string,true,""
#  plain string,false,hello
#
load_data("/path/to/test-data-without-header.csv")
def test_empty?(data)
  expected, target = data
  assert_equal(expected, target.empty?)
end

@api private

# File test-unit-3.6.7/lib/test/unit/data.rb, line 258
def load_csv(file_name)
  require 'csv'
  first_row = true
  header = nil
  CSV.foreach(file_name) do |row|
    if first_row
      first_row = false
      if row.first == "label"
        header = row[1..-1]
        next
      end
    end

    set_test_data(header, row)
  end
end
load_tsv(file_name) 点击切换源代码

从 TSV 文件加载数据。

TSV 文件有两种类型,如下面的示例所示。第一种,第一行有标题,并且它的第一列是 “label”。另一种,文件中没有标题。

@example 从带有标题的 TSV 文件加载数据

# test-data.tsv:
#  label  expected target
#  empty string   true      ""
#  plain string   false     hello
#
load_data("/path/to/test-data.tsv")
def test_empty?(data)
  assert_equal(data["expected"], data["target"].empty?)
end

@example 从没有标题的 TSV 文件加载数据

# test-data-without-header.tsv:
#  empty string   true      ""
#  plain string   false     hello
#
load_data("/path/to/test-data-without-header.tsv")
def test_empty?(data)
  expected, target = data
  assert_equal(expected, target.empty?)
end

@api private

# File test-unit-3.6.7/lib/test/unit/data.rb, line 304
def load_tsv(file_name)
  require "csv"
  if CSV.const_defined?(:VERSION)
    first_row = true
    header = nil
    CSV.foreach(file_name, :col_sep => "\t") do |row|
      if first_row
        first_row = false
        if row.first == "label"
          header = row[1..-1]
          next
        end
      end

      set_test_data(header, row)
    end
  else
    # for old CSV library
    first_row = true
    header = nil
    CSV.open(file_name, "r", "\t") do |row|
      if first_row
        first_row = false
        if row.first == "label"
          header = row[1..-1]
          next
        end
      end

      set_test_data(header, row)
    end
  end
end

私有实例方法

normalize_value(value) 点击切换源代码
# File test-unit-3.6.7/lib/test/unit/data.rb, line 339
def normalize_value(value)
  return true if value == "true"
  return false if value == "false"
  begin
    Integer(value)
  rescue ArgumentError
    begin
      Float(value)
    rescue ArgumentError
      value
    end
  end
end
set_test_data(header, row) 点击切换源代码
# File test-unit-3.6.7/lib/test/unit/data.rb, line 353
def set_test_data(header, row)
  label = row.shift
  if header
    data = {}
    header.each_with_index do |key, i|
      data[key] = normalize_value(row[i])
    end
  else
    data = row.collect do |cell|
      normalize_value(cell)
    end
  end
  @test_case.data(label, data)
end