2015-01-26 3 views
0

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

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

Является ли это выполнимым?

ответ

1

Вы можете получить размер файла в начале теста, а затем seek к этой точке:

the_log = Rails.root.join("log", "test.log") 
size_at_start = the_log.size 
... test stuff ... 
File.open(the_log) do |f| 
    # Skip to the point in the log where our test started 
    f.seek(size_at_the_start) 
    while line = f.gets 
    # We found what we were looking for 
    break if line =~ /required message/ 
    end 
    fail("We haven't found what we were looking for") 
end 

Если вы действительно хотели, чтобы высушить вы могли бы сделать, что метод в вашем тесте-помощник, то например:

def test_log_output(required_output_regexp, 
        the_log = Rails.root.join("log", "test.log"), 
        &test_code) 
    size_at_start = the_log.size 
    test_code.call 
    File.open(the_log) do |f| 
    f.seek(size_at_the_start) 
    while line = f.gets 
     # We found what we were looking for 
     break if line =~ required_output_regexp 
    end 
    fail("We haven't found what we were looking for") 
    end 
end 
+0

Работал великолепно! – Vardarac

0

Хотя не совсем ответ, этот другой s.o. вопрос - Insert rows on specific line in a file - выделяет немало методов (readline, seek), которые должны помочь вам делать то, что вы хотите.

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