2014-12-04 3 views
0

У меня есть блок кода, который создает TempFilesПроблемы с тестированием TempFile рубина

@tmp_file = Tempfile.new("filename") 

Я держать их закрытыми после создания,

@tmp_file.close unless @tmp_file.closed? 

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

def add_row_to_file(row) 
     @tmp_file.open 
     @tmp_file.read 
     @tmp_file.print(row.to_json + "\n") 
    end 

Все это хорошо, но для тестирования такой же я загасил, как временный файл Белу ш и создает ошибку, когда тест запускается в add_row_to_file(row)

buffers = {} 

    Tempfile.stub(:new) do |file_name| 
    buffer = StringIO.new 
    buffers[file_name] = buffer 
    end 

сообщение об ошибке:

Failure/Error: ]], 
NoMethodError: 
    private method `open' called for #<StringIO:0x00000010b867c0> 

Я хочу, чтобы держать временные файлы закрыты по созданию как есть максимум временных файлов открытый вопрос на уровне ОС (мне приходится иметь дело с загрузкой партии tempfiles на S3) , но для тестирования у меня есть проблема с доступом к частному методу StringIO.

Любая идея, как решить эту проблему? Благодарю.

У меня есть работа, которая должна пропустить закрытие StringIO в тестовой среде.

@tmp_file.close unless @tmp_file.closed? || Rails.env.test? 

и обновить add_row_to_file(row) ниже

def add_row_to_file(row) 
     @tmp_file.open unless Rails.env.test? 
     @tmp_file.read unless Rails.env.test? 
     @tmp_file.print(row.to_json + "\n") 
    end 
+0

Почему вы не закрываете 'Tempfile # open'? – mudasobwa

+0

У сильного не существует метода 'open' (так что вы на самом деле вызываете ядро ​​# open) –

+0

Я согласен с @mudasobwa. Не закрывайте 'new' и не проверяйте поведение файла чтения, это не ваш случай. Проверьте, что важно здесь, с точки зрения вашего приложения. Если вам нужны некоторые входные данные, подделайте их в своем тесте. – blelump

ответ

0

Помимо работы вокруг при условии, если мы хотим, чтобы покрытие кода 100% в то время как в тесте можно попробовать ниже.

Не закрывать поток, если он StringIO

@tmp_file.close unless @tmp_file.is_a?(StringIO) 

поэтому нам не нужно, чтобы открыть его в то время как в тесте.

def add_row_to_file(row) 
     @tmp_file = File.open(@tmp_file, 'a+') unless @tmp_file.is_a?(StringIO) 
     @tmp_file.print(row.to_json + "\n") 
    end 

Таким образом, мы можем достичь тестирования TempFile без фактического создания файлов в тестовой среде и имеющий покрытие кода 100% в то время как в тесте.

Смежные вопросы