web-dev-qa-db-fra.com

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

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.

69
s12chung

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
57
Phil Calvin

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
62
Thomas B Homburg

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
29
Jared Beck

Une solution qui me plait, car elle garde la sortie rspec séparée de la sortie réelle Rails log), est la suivante:

  • Ouvrez une seconde fenêtre ou un autre onglet du terminal et organisez-le de sorte que vous puissiez voir à la fois le terminal principal sur lequel vous exécutez rspec et le nouveau.
  • Exécutez une commande tail dans la deuxième fenêtre pour afficher le journal Rails) dans l’environnement de test. Par défaut, cela peut ressembler à $ tail -f $Rails_APP_DIR/logs/test.log ou tail -f $Rails_APP_DIR\logs\test.log pour les utilisateurs de Windows
  • Exécutez vos suites rspec

Si 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.

21

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
6
manglewood