2016-05-01 11 views
0

Ich bereite Tests in Ruby/Cucumber/Calabash vor. Ich habe eine Textdatei voller Protokolle. Ich muss überprüfen, ob bestimmte Zeile/Satz in den Protokollen vorhanden ist, z. B. "Bitte beantworten Sie meine Frage". Ich nehme an, dass jedes Wort unabhängig mehrere Male vorhanden ist, aber in dieser Zeile nur einmal. Ich muss TRUE zurückgeben. Bisher als ich versuchte, mit:wie überprüft man, ob eine Datei eine bestimmte Zeile in Ruby enthält

def check_file(file, string) 
    File.open(file) do |io| 
    io.each {|line| line.chomp! ; return line if line.include? string} 
    end 

    nil 
end 

und es ist immer noch arbeiten String existiert nicht (ich bin nicht sicher, warum?)

Soll ich Arrays versuchen?

+1

Wie könnte es jemals zurückkehren 'true' wenn die letzte Zeile' nil' ist? Sie möchten [Enumerable #find] (http://ruby-doc.org/core-2.3.1/Enumerable.html#method-i-find) verwenden, nicht [IO.each] (http: // rubi- doc.org/core-2.3.0/IO.html#method-i-each) wenn Sie nur wissen wollen, ob der String mindestens einmal in der Datei vorhanden ist. ('IO'' '' Enumerable' '). –

+0

Können Sie zeigen, wie es heißt? –

Antwort

1

Hier ist eine Methode, die tut was Sie wollen, ganz einfach. Wie bei Ihnen, gibt es die Zeile zurück, wenn es eine Übereinstimmung gibt, und Null, wenn es keine gibt.

def check_file(file, string) 
    File.foreach(file).detect { |line| line.include?(string) } 
end 

1.9.3-p551 :007 > check_file 'Gemfile', 'gem' 
=> "source 'https://rubygems.org'\n" 
1.9.3-p551 :008 > check_file 'Gemfile', 'gemxx' 
=> nil 

Sie den Rückgabewert für Truthiness-Methode testen, um zu sehen, ob etwas gefunden wurde:

if check_file(myfile, mystring) 
    # .... 
Verwandte Themen