[英]No terminal output with caypbara / rspec / selenium-webdriver
我一直在使用capybara和selenium-webdriver編寫rspec測試。 幾乎沒有失敗,每當我運行這些測試之一時,控制台輸出就消失了。
例如:
~/code/code> bundle exec rspec spec/features/interactions_spec.rb
InteractionsSpec
~/code/code>
那就是我所見過的一切。 瀏覽器啟動,執行我已經編碼的動作,但是看不到通常的輸出。
有時,我會改為將其視為輸出(是!):
InteractionsSpec
login as admin works
login as user works
Finished in 16.84 seconds (files took 7.9 seconds to load)
2 examples, 0 failures
是什么導致測試的輸出消失? 這幾乎使得不可能編寫測試-因為我不知道運行了什么,通過了什么,失敗了,或者為什么失敗了。
我正在使用這些Gems,但是執行捆綁包更新不會更改行為。
其他涉及的軟件:
更新這似乎可以解決該問題一段時間,即使睡眠時間為1ms。 但是,那只是一個臨時解決方法,此問題仍然存在。
RSpec.configure do |config|
config.before(:each, :type => :feature) do
sleep(0.5)
end
end
在我看來,記錄器正在通過其他線程對logger.silence()的調用而變得沉默。
當您將sleep()放入代碼中時,便產生了其他固定日志記錄級別的線程-這就是為什么休眠多長時間都無關緊要的原因是上下文切換可以解決此問題。
當您升級activesupport gem時,此提交可以在https://github.com/rails/activerecord-session_store/commit/f92d1135fc620cb4d65239ef286b267945bbbbc6解決(如您所說)。 閱讀該提交后,請注意logger.silence的新線程安全實現。 這就是為什么它可以解決您的問題。
這里的active_support / logger_silence.rb的舊實現不是線程安全的:
require 'active_support/concern'
module LoggerSilence
extend ActiveSupport::Concern
included do
cattr_accessor :silencer
self.silencer = true
end
# Silences the logger for the duration of the block.
def silence(temporary_level = Logger::ERROR)
if silencer
begin
old_logger_level, self.level = level, temporary_level
yield self
ensure
self.level = old_logger_level
end
else
yield self
end
end
end
在使用多線程的水豚下初始化Rails環境時,似乎存在許多與線程安全和競爭條件有關的問題。 Rob的答案解釋了為什么它開始工作(將日志記錄固定為在activerecord-session_store中進行線程保存)。
這些問題和提交似乎也相關
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.