Ruby Mock файл с помощью StringIO
Я пытаюсь смоделировать чтение файла с помощью StringIO в Ruby. Следующее - мой тест, и рядом с ним - мой метод в основном классе.
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 равным содержимому.
1 ответ
Ваш метод 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