caypbara / rspec / selenium-webdriver没有终端输出

时间:2014-11-24 20:46:34

标签: ruby-on-rails rspec selenium-webdriver capybara

我一直在使用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,但执行捆绑更新不会改变行为。

  • capybara(2.4.4)
  • capybara-screenshot(1.0.3)
  • rspec(3.0.0)
  • rspec-activemodel-mocks(1.0.1)
  • rspec-collection_matchers(1.0.0)
  • rspec-core(3.0.3)
  • rspec-expectations(3.0.3)
  • rspec-mocks(3.0.3)
  • rspec-rails(3.0.2)
  • rspec-support(3.0.3)
  • selenium-webdriver(2.44.0)
  • shoulda-matcher(2.6.2)

其他涉及的软件:

  • Firefox 33.1.1(Chrome 39.0.2171.65(64位)具有相同的行为)
  • OSX 10.9.5
  • Rails 4.1.4

更新 这似乎解决了一段时间的问题,即使睡眠时间为1毫秒。但是,这只是一个临时修复,这个问题仍然存在。

RSpec.configure do |config|
  config.before(:each, :type => :feature) do
    sleep(0.5)
  end
end

2 个答案:

答案 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中进行线程保存)。

似乎这些问题和提交也是相关的