class RuboCop::Cop::RSpec::ExpectOutput
expect { my_app.print_report }.to output(‘Hello World’).to_stdout
# good
expect($stdout.string).to eq(‘Hello World’)
$stdout = STDOUT
my_app.print_report
$stdout = StringIO.new
# bad
@example
Checks for opportunities to use ‘expect { … }.to output`.
def inside_example_scope?(node)
within a `before(:all)` or otherwise outside of an example
an expectation. Therefore, assignments to stderr or stdout
we only care about situations where you would replace with
We want to encourage using `expect { ... }.to output` so
Detect if we are inside the scope of a single example
def inside_example_scope?(node) return false if node.nil? || example_group?(node) return true if example?(node) return RuboCop::RSpec::Hook.new(node).example? if hook?(node) inside_example_scope?(node.parent) end
def on_gvasgn(node)
def on_gvasgn(node) return unless inside_example_scope?(node) name = node.name[1..] return unless name.eql?('stdout') || name.eql?('stderr') add_offense(node.loc.name, message: format(MSG, name: name)) end