我正在尝试在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

我想知道这是否是我们模拟读取文件的方式,我也想知道是否还有其他方法可以在类中模拟该方法,而不是断言与内容相等。

最佳答案

测试中永远不会调用您的方法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
FileStringIO实例均对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

关于Ruby用StringIO模拟文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19110063/

10-13 05:37