How can I configure rspec to show output with spor

2020-03-03 08:27发布

I have spork running to speed up my tests but there is no output when I run them. Is there a configuration that I need to modify?

标签: rspec spork
2条回答
聊天终结者
2楼-- · 2020-03-03 09:25

@astgtciv already answered the question, but here's a related thing I ran into that is too long for writing as a comment:

Using @astgtciv's fix worked for me, but it broke again when I introduced a custom formatter. My guess is that the formatter is initialized when Spork boots, so its output stream is in the DRB server window instead of the test runner window.

My fix was to add attr_accessor :output to my custom formatter, then change the output inside Spork.each_run, e.g:

rspec_formatters = RSpec.configuration.formatters

Spork.each_run do
  if Spork.using_spork?
    RSpec.configure do |config|
      config.output_stream = $stdout
    end

    rspec_formatters.each do |formatter|
      if formatter.respond_to?(:output=)
        formatter.output = $stdout
      end
    end
  end
end

A simpler fix would be to just add the formatter inside this code block, but I thought this might be faster (in terms of test run speed) and not risk adding the same formatter multiple times. Have not verified that guess though.

查看更多
▲ chillily
3楼-- · 2020-03-03 09:26

Just ran into this as well, running on spork 1.0.0rc4 and rspec 2.14.1 / rspec-core 2.14.8 . As far as I could figure it out, the problem lies in the following:

  1. Spork configures the $stdout to point to localhost:port (drb client) so that all reporter output is sent to the drb client. This now happens after the Spork.prefork is ran.
  2. In my Spork.prefork block I was (naturally) doing RSpec.configure do |config|, and one of the config calls there (in particular config.mock_with :rr), was causing a sequence of calls that eventually caused the reporter/formatters in RSpec.configuration to be initialized - but without the incorrect stdout.
  3. RSpec.configuration has a reset method (marked as @private but alas), which flushes the initialized reporter/formatters, to be lazily reinitialized.
  4. Also, somehow RSpec.configuration.output_stream is never set. Bottom line, adding this code to Spork.each_run appears to fix the problem:

    if Spork.using_spork?
        RSpec.configure do |config|
            config.reset
            config.output_stream = $stdout
        end
    end
    

If anyone knows of a more elegant way to solve this, please tell!

查看更多
登录 后发表回答