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
?
Ugh verpasst, dass dank! Das passiert, wenn ich die Methodenabstraktion zu schnell mache ... – dfaulken