我一直在使用capybara和selenium-webdriver编写rspec测试。几乎没有失败,每当我运行其中一个测试时,控制台输出都消失了。
例如:
~/code/code> bundle exec rspec spec/features/interactions_spec.rb
InteractionsSpec
~/code/code>
这就是我所见过的一切。浏览器启动,执行我编码的动作,但我没有看到通常的输出。
有时我会将此视为输出(yay!):
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,但执行捆绑更新不会改变行为。
其他涉及的软件:
更新 这似乎解决了一段时间的问题,即使睡眠时间为1毫秒。但是,这只是一个临时修复,这个问题仍然存在。
RSpec.configure do |config|
config.before(:each, :type => :feature) do
sleep(0.5)
end
end
答案 0 :(得分:3)
在我看来,记录器通过一些其他线程调用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
答案 1 :(得分:1)
在使用多线程的水豚下初始化rails环境时,似乎存在许多与线程安全和竞争条件相关的问题。 Rob的答案解释了为什么它开始工作(日志记录固定为在activerecord-session_store中进行线程保存)。
似乎这些问题和提交也是相关的