2012-02-17 1 views
1

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

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 и любая помощь будет оценена. Благодарю.

ответ

0

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

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

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

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

Спасибо за ответ. То, что я пытаюсь проверить, это не файл ввода/вывода. То, что я пытаюсь проверить, - это то, что происходит с отдельными записями в файле (т. Е. В цикле). Я могу легко заглушить/издеваться над файлами. У меня возникают проблемы с запутыванием/издевательством - это открытие/закрытие самого файла. – Agazoom

+1

@Agazoom: Хорошо, как насчет того, чтобы полностью удалить файл из уравнения? Операции с файлами работают как любая другая процедура ввода-вывода. Перейдите в издеваемый входной поток к алгоритму и убедитесь, что результат правильный. Он не должен быть файловым объектом, он просто должен иметь один и тот же интерфейс. –

+0

Любые указатели на то, где я могу найти что-то подобное? Я новичок в рубине, поэтому любой источник, который вы можете предоставить, будет полезен. – Agazoom

0

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

0

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