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
Другие вопросы по тегам