Какую стратегию я должен использовать для модульного тестирования чтения файла в ruby ​​(rspec)? - PullRequest
1 голос
/ 18 февраля 2012

У меня есть метод ruby, который построчно обрабатывает очень большой файл (т.е. я не могу загрузить файл в память), как показано ниже:

def process_file
   file = File.new(@@data_file, "r") 
     while (line = file.gets)
       { do something with the line } ...
     end
   file.close

   return "upload complete"
end

Согласно рекомендациям, я не хочу, чтобы этот метод опирался на файловую систему. Я раньше использовал заглушки, но я не уверен, как бы я использовал их здесь. Я предположил бы, что я использовал бы что-то эквивалентное:

file = File.stub!(:new).and_return({something})

Я просто не уверен, что {что-то} есть.

Я использую rspect, и любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2012

Вы всегда можете проверить, если вы вызываете правильные методы, по крайней мере, close() после. Я думаю, что это самая частая ошибка ввода / вывода.

0 голосов
/ 18 февраля 2012

Возможно, вы захотите взглянуть на MockFS , который отключает работу файловой системы.

0 голосов
/ 18 февраля 2012

Я не думаю, что здесь требуется юнит-тест. Вы боитесь, что каким-то образом создание файлов / закрытие файлов будет нарушено в какой-то будущей версии Ruby? Это не так, не волнуйтесь.

Пусть разработчики Ruby беспокоятся о модульном тестировании своих процедур ввода-вывода для файлов конкретной платформы. Вам следует беспокоиться о модульном тестировании ваших алгоритмов , в частности тех алгоритмов, которые являются критическими и сложными (т. Е. Подвержены поломкам, если вы неосторожны).

Тем не менее, вы, вероятно, должны просто передать блок конструктору. Это гарантирует, что файл будет закрыт для вас при выходе из блока и будет более идиоматическим.

File.open(some_file_path, 'w+') do |file|
  file.puts('content')
end
...