99 votes

Comment obtenir l'impression de Rails.logger sur la console/stdout lors de l'exécution de rspec ?

Même titre que le titre : Comment obtenir Rails.logger l'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 pour aller à log/test.log aussi.

98voto

Thomas B Homburg Points 1831

Pour Rails 4.x, le niveau du journal est configuré un peu différemment de celui de 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 du collecteur est défini sur l'instance du collecteur à partir de config.log_level à : https://github.com/rails/rails/blob/v4.2.4/railties/lib/rails/application/bootstrap.rb#L70

Variable d'environnement

En prime, vous pouvez autoriser l'écrasement du niveau du journal en utilisant une variable d'environnement avec une valeur par défaut comme suit :

# default :ERROR
config.log_level = ENV.fetch("LOG_LEVEL", "ERROR")

Et ensuite exécuter les tests à partir du shell :

# Log level :INFO (the value is uppercased in bootstrap.rb)
$ LOG_LEVEL=info rake test

# Log level :ERROR
$ rake test

77voto

Phil Calvin Points 1943

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 permettra d'intercaler toutes les erreurs qui sont enregistrées pendant les tests dans STDOUT. Vous pouvez souhaiter acheminer la sortie vers STDERR ou utiliser un niveau de journalisation différent à la place.

L'envoi de ces messages à la fois à la console et à un fichier journal nécessite quelque chose de plus robuste que la fonction intégrée de Ruby, à savoir Enregistreur classe. Le site journalisation La gemme fera ce que vous voulez. Ajoutez-le à votre Gemfile puis de mettre en place deux appenders 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

40voto

Jared Beck Points 4975

Terminer le journal en tant que travail de fond (&) et il s'intercalera avec la sortie de rspec.

tail -f log/test.log &
bundle exec rspec

21voto

Shyam Habarakada Points 2360

Une solution que j'apprécie, parce qu'elle permet de séparer la sortie de rspec de la sortie du journal de rails, est de faire ce qui suit :

  • Ouvrez une deuxième fenêtre de terminal ou un onglet, et arrangez-la de manière à ce que vous puissiez voir à la fois le terminal principal sur lequel vous exécutez rspec et le nouveau terminal.
  • Exécutez une commande tail dans la deuxième fenêtre afin de voir le journal de rails dans l'environnement de test. Par défaut, cela peut être comme $ tail -f $RAILS_APP_DIR/logs/test.log o tail -f $RAILS_APP_DIR\logs\test.log pour les utilisateurs de Windows
  • Exécutez vos suites rspec

Si vous utilisez un terminal multi-fenêtres comme iTerm, cela devient encore plus amusant et vous avez rspec et le test.log côte à côte.

8voto

manglewood Points 729

Vous pouvez définir une méthode dans spec_helper.rb qui envoie un message à la fois à Rails.logger.info et à puts et l'utiliser pour le débogage :

def log_test(message)
    Rails.logger.info(message)
    puts message
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X