我试图在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
我想知道这是否是我们模拟文件读取的方式,而且我想知道是否有其他方法来模拟类中的方法而不是将assert与内容相等。
答案 0 :(得分: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