Identique au titre: Comment obtenir Rails.logger
impression sur la console/stdout lors de l’exécution de rspec? Par exemple.
Rails.logger.info "I WANT this to go to console/stdout when rspec is running"
puts "Like how the puts function works"
Je veux toujours Rails.logger
aller à log/test.log
aussi.
Pour Rails 4, voir cette réponse.
Pour Rails 3.x, configurez un enregistreur dans config/environments/test.rb
:
config.logger = Logger.new(STDOUT)
config.logger.level = Logger::ERROR
Cela entrelacera toutes les erreurs consignées lors des tests dans STDOUT. Vous souhaiterez peut-être acheminer la sortie vers STDERR ou utiliser un autre niveau de journalisation.
L'envoi de ces messages à la fois à la console et à un fichier journal nécessite quelque chose de plus robuste que la classe intégrée Logger de Ruby. La journalisation gem fera ce que vous voulez. Ajoutez-le à votre Gemfile
, puis configurez deux ajouts dans config/environments/test.rb
:
logger = Logging.logger['test']
logger.add_appenders(
Logging.appenders.stdout,
Logging.appenders.file('example.log')
)
logger.level = :info
config.logger = logger
Pour Rails 4.x, le niveau de journalisation est configuré de manière légèrement différente de celle utilisée dans Rails 3.x
Ajoutez ceci à config/environment/test.rb
# Enable stdout logger
config.logger = Logger.new(STDOUT)
# Set log level
config.log_level = :ERROR
Le niveau de journalisation est défini sur l'instance de journalisation à partir de config.log_level
à: https://github.com/Rails/rails/blob/v4.2.4/railties/lib/Rails/application/bootstrap.rb#L7
Variable d'environnement
En prime, vous pouvez autoriser le remplacement du niveau de journalisation à l'aide d'une variable d'environnement avec une valeur par défaut, comme suit:
# default :ERROR
config.log_level = ENV.fetch("LOG_LEVEL", "ERROR")
Et puis en exécutant des tests de Shell:
# Log level :INFO (the value is uppercased in bootstrap.rb)
$ LOG_LEVEL=info rake test
# Log level :ERROR
$ rake test
Découpez le journal en tant que tâche en arrière-plan (&) et il entrelacera avec la sortie rspec.
tail -f log/test.log &
bundle exec rspec
Une solution qui me plait, car elle garde la sortie rspec séparée de la sortie réelle Rails log), est la suivante:
$ tail -f $Rails_APP_DIR/logs/test.log
ou tail -f $Rails_APP_DIR\logs\test.log
pour les utilisateurs de WindowsSi vous utilisez un terminal à volets multiples comme iTerm, cela devient encore plus amusant et vous avez rspec
et le test.log
sortie côte à côte.
Vous pouvez définir une méthode dans spec_helper.rb qui envoie un message à Rails.logger.info ainsi qu’à l’utiliser pour le débogage:
def log_test(message)
Rails.logger.info(message)
puts message
end