5

我正在尝试 借助 Ruby 中的 StringIO来模拟文件读取。以下是我的测试,旁边是我在主类中的方法。

def test_get_symbols_from_StringIO_file
    s = StringIO.new("YHOO,141414")
    assert_equal(["YHOO,141414"], s.readlines)
end

def get_symbols_from_file (file_name)
  IO.readlines(file_name, ',')
end

我想知道这是否是我们模拟读取文件的方式,并且我想知道是否有其他方法可以模拟类中的方法,而不是对内容进行断言。

4

1 回答 1

10

您的方法get_symbols_from_file永远不会在测试中被调用。您只是在测试是否StringIO#readlines有效,即:

StringIO.new("YHOO,141414").readlines == ["YHOO,141414"] #=> true

如果要使用StringIO实例作为文件的占位符,则必须更改方法以获取File实例而不是文件名:

def get_symbols_from_file(file)
  file.readlines(',')
end

File和实例都StringIO响应readlines,因此上述实现可以同时处理这两种情况:

def test_get_symbols_from_file
  s = StringIO.new("YHOO,141414")
  assert_equal(["YHOO,141414"], get_symbols_from_file(s))
end

然而,这个测试失败了:readlines包括行分隔符,所以它返回一个包含两个元素的数组"YHOO,"(注意逗号)和"141414". 您期待一个包含一个元素的数组"YHOO,141414"

也许你正在寻找这样的东西:

def test_get_symbols_from_file
  s = StringIO.new("YHOO,141414")
  assert_equal(["YHOO", "141414"], get_symbols_from_file(s))
end

def get_symbols_from_file(file)
  file.read.split(',')
end

如果你真的想使用IO::readlines你可以创建一个Tempfile

require 'tempfile'

def test_get_symbols_from_file
  Tempfile.open("foo") { |f|
    f.write "YHOO,141414"
    f.close
    assert_equal(["YHOO", "141414"], get_symbols_from_file(f.path))
  }
end
于 2013-10-01T08:01:55.740 回答