用StringIO模拟文件的Ruby实现

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

我想知道这是否是我们模拟文件读取的方式,也想知道除了使用内容进行断言相等之外,是否有其他方法来模拟类中的方法。


1
@SergioTulentsev,测试通过了,但是get_symbols_from_file在测试中实际上从未被调用。 - Stefan
@Stefan,我同意。上面的测试毫无价值,因为该方法甚至从未被调用! - Patrick Oscity
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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接