2017-08-01 1 views
0

Ich habe den folgenden Ruby-Code:RSpec spöttisch, `name` nicht innerhalb einer Beispielgruppe verfügbar

def report_deviation(departure) 
    deviation = departure.fetch('Dev') 
    trip = departure.fetch('Trip') 
    run_id = trip.fetch('RunId') 
    headsign = trip.fetch('InternetServiceDesc') 
    timestamp = Time.now.strftime '%l:%M %P' 
    FileUtils.mkdir 'log' unless File.directory? 'log' 
    File.open DAILY_LOG_FILE, 'a' do |file| 
    file.puts "#{timestamp}, #{name}: Run #{run_id} (#{headsign}), deviation #{deviation}" 
    end 
end 

durch den folgenden RSpec Code getestet:

describe 'report_deviation' do 
    let(:departure) { double } 
    let(:trip) { double } 
    let(:file) { double } 
    it 'appends to a log file with the correct entry format' do 
    expect(departure).to receive(:fetch).with('Trip').and_return trip 
    expect(departure).to receive(:fetch).with('Dev').and_return 'DEVIATION' 
    expect(trip).to receive(:fetch).with('RunId') 
     .and_return 'RUN' 
    expect(trip).to receive(:fetch).with('InternetServiceDesc') 
     .and_return 'HEADSIGN' 
    stub_const 'DeviationValidator::DAILY_LOG_FILE', :log_file 
    expect(File).to receive(:open).with(:log_file, 'a').and_yield file 
    timestamp = '12:00 pm: Run RUN (HEADSIGN), deviation DEVIATION' 
    expect(file).to receive(:puts).with timestamp 
    Timecop.freeze(Time.new 2017, 7, 31, 12) { report_deviation(departure) } 
    end 
end 

Aber wenn ich laufe ich empfange die Fehlermeldung:

`name` is not available from within an example (e.g. an `it` block) or from constructs that run in the scope of an example (e.g. `before`, `let`, etc). It is only available on an example group (e.g. a `describe` or `context` block). 

das Wort name wird hier nirgendwo geschrieben, und wenn ich die endgültige entfernen Zeile des Tests (die den tatsächlichen Code aufruft) Ich bekomme die Testfehler, die ich für nicht erfüllte Ausnahmen erwarten würde. Normalerweise koche ich meinen Code auf die Teile, die den Fehler verursachen, aber ich habe keine Ahnung, was den Fehler verursacht.

Für das, was es wert ist, die spezifische Zeilennummer in der Backtrace erwähnt ist die file.puts im File.open blockieren - aber ich verstehe nicht, warum das zu einem Fehler führen soll. Ich habe Testdoubles eingerichtet, so dass diese Objekte nichts Besonderes sind - File empfängt open und liefert file, deren einzige Aufgabe es ist, auf den Empfang der puts mit der Zeichenfolge zu warten, die ich erwarte. Also, welches Stück Code ruft, was passiert, ein Schlüsselwort RSpec Methode name?

Antwort

2

name ist kein Schlüsselwort RSpec Methode, es ist eine Methode, die report_deviation

file.puts "#{timestamp}, #{name}: Run #{run_id} (#{headsign}), deviation #{deviation}" 

aber die Methode zu nennen versucht ist nicht definiert.

Sie müssen die name-Methode in der Klasse definieren, in der report_deviation definiert ist. Oder, wenn report_deviation definiert ist und in der Spec-Datei verwendet, fügen Sie eine einfache Variable namens name:

describe 'report_deviation' do 
    let(:departure) { double } 
    let(:trip) { double } 
    let(:file) { double } 
    let(:name) { "simple name" } 
    ... 
+0

Ugh verpasst, dass dank! Das passiert, wenn ich die Methodenabstraktion zu schnell mache ... – dfaulken

Verwandte Themen