/ / RSpec prueba si se escribe un registro personalizado de Rails: ruby-on-rails, logging, rspec

Prueba de RSpec si se escribe un registro personalizado de Rails - ruby-on-rails, logging, rspec

Estoy intentando probar un método que registra varios mensajes basados ​​en condicionales en un registro que es no el registrador Rails predeterminado. Formateé el registrador en config/environment.rb:

# Format the logger
class Logger
def format_message(level, time, progname, msg)
"#{time.to_s(:db)} #{level} -- #{msg}n"
end
end

y creó un nuevo registrador en la clase ImportRecording en el lib/ directorio. Un método de esa clase incluye lo siguiente:

# some code omitted...
days.each do |day|
if not hash[day].include? "copied"
@log.error "#{day} needs to be copied!"
end
if not hash[day].include? "compressed"
@log.error "#{day} needs to be compressed!"
end
if not hash[day].include? "imported"
@log.debug "#{day} needs to be imported"
`rake RAILS_ENV=#{Rails.env} recordings:import[#{day}]` unless Rails.env == "test"
end
end
# finishing up logging omitted...

Escribí una pequeña macro para ayudar a probar este método:

def stub_todo
{ "20130220" => ["copied"],
"20130219" => ["copied", "compressed"],
"20130218" => ["copied", "compressed", "imported"] }
end

y aquí está mi prueba:

describe ".execute_todo" do
it "carries out the appropriate commands, based on the todo hash" do
ImportRecording.execute_todo stub_todo
ImportRecording.log.should_receive(:debug).with("20130219 needs to be imported")
ImportRecording.log.should_receive(:error).with("20130220 needs to be compressed!")
ImportRecording.log.should_receive(:debug).with("20130220 needs to be imported")
end
end

Miro el registro de importación mientras ejecuto estas pruebasy observe cómo se agregan las líneas (hay un retraso, porque el registro es grande ahora), pero las pruebas aún fallan. Me pregunto si el formato del registro está arruinando esto, pero a.m pasando las cadenas mencionadas anteriormente a los métodos :debug y :error al registro. ¿Alguna ayuda?

EDITAR 14/03/13:

Con la esperanza de que alguien pueda ayudarme aquí, cambié por prueba para tener el siguiente aspecto:

it "carries out the appropriate commands, based on the todo hash" do
ImportRecording.stub!(:execute_todo).with(stub_todo).and_return(false)
ImportRecording.log.should_receive(:debug).with("20130219 needs to be imported")
ImportRecording.log.should_receive(:error).with("20130220 needs to be compressed!")
ImportRecording.log.should_receive(:debug).with("20130220 needs to be imported")
end

y este es el error que recibo de RSpec:

Failure/Error: ImportRecording.log.should_receive(:debug).with("20130219 needs to be imported")
(#<Logger:0x007fb04fa83ed0>).debug("20130219 needs to be imported")
expected: 1 time
received: 0 times

Respuestas

3 para la respuesta № 1

Encontré el problema. De alguna manera, se supone que estas expectativas deben declararse antes de el método que realmente debería causarlos. El código debe leer

it "carries out the appropriate commands, based on the todo hash" do
ImportRecording.log.should_receive(:debug).with("20130219 needs to be imported")
ImportRecording.log.should_receive(:error).with("20130220 needs to be compressed!")
ImportRecording.log.should_receive(:debug).with("20130220 needs to be imported")
ImportRecording.execute_todo stub_todo
end

Las pruebas ahora pasan. También tuve que agregar más líneas a la prueba para tener en cuenta cada línea que se escribió en el registro debido a la llamada al método. Entonces, para los futuros investigadores, exprese sus expectativas y entonces llamar al método.


0 para la respuesta № 2

Miro el registro de importación mientras ejecuto estas pruebas y veo cómo se agregan las líneas

Si establece expectativas de mensajes en las llamadas del registrador, debe no vea las líneas agregadas al registro. Al igual que los stubs, las expectativas de mensajes reemplazan la implementación del método original. Esto sugiere que la configuración de su registrador está mal configurada de alguna manera.