Suppress console output during RSpec tests

后端 未结 7 1135
小鲜肉
小鲜肉 2020-12-02 12:24

I am testing the class which put on the console some messages (with puts, p warnings and etc.). I am just wondering if there is any ability to suppress this output during R

7条回答
  •  遥遥无期
    2020-12-02 12:59

    I suppress puts output in my classes by redirecting $stout to a text file. That way, if I need to see the output for any reason, it is there but it doesn't muddy up my test results.

    #spec_helper.rb
    RSpec.configure do |config|
      config.before(:all, &:silence_output)
      config.after(:all,  &:enable_output)
    end
    
    public
    # Redirects stderr and stout to /dev/null.txt
    def silence_output
      # Store the original stderr and stdout in order to restore them later
      @original_stderr = $stderr
      @original_stdout = $stdout
    
      # Redirect stderr and stdout
      $stderr = File.new(File.join(File.dirname(__FILE__), 'dev', 'null.txt'), 'w')
      $stdout = File.new(File.join(File.dirname(__FILE__), 'dev', 'null.txt'), 'w')
    end
    
    # Replace stderr and stdout so anything else is output correctly
    def enable_output
      $stderr = @original_stderr
      $stdout = @original_stdout
      @original_stderr = nil
      @original_stdout = nil
    end
    

    EDIT:

    In response to the comment by @MyronMarston, it probably would be smarter to just insert the methods directly into before and after as blocks.

    #spec_helper.rb
    RSpec.configure do |config|
      original_stderr = $stderr
      original_stdout = $stdout
      config.before(:all) do 
        # Redirect stderr and stdout
        $stderr = File.new(File.join(File.dirname(__FILE__), 'dev', 'null.txt'), 'w')
        $stdout = File.new(File.join(File.dirname(__FILE__), 'dev', 'null.txt'), 'w')
      end
      config.after(:all) do 
        $stderr = original_stderr
        $stdout = original_stdout
      end
    end
    

    It looks a little cleaner and keeps methods off of main. Also, note that if you are using Ruby 2.0, you can use __dir__ instead of File.dirname(__FILE__).

    EDIT2

    Also it should be mentioned, that you can forward to true os /dev/null by using File::NULL as it was introduced in Ruby v 1.9.3. (jruby 1.7)

    Then the code snippet will look as following:

    #spec_helper.rb
    RSpec.configure do |config|
      original_stderr = $stderr
      original_stdout = $stdout
      config.before(:all) do
        # Redirect stderr and stdout
        $stderr = File.open(File::NULL, "w")
        $stdout = File.open(File::NULL, "w")
      end
      config.after(:all) do
        $stderr = original_stderr
        $stdout = original_stdout
      end
    end
    

提交回复
热议问题