Last active

Embed URL

HTTPS clone URL

SSH clone URL

You can clone with HTTPS or SSH.

Download Gist
View 01 example_spec.rb
1 2 3 4 5 6 7 8 9 10 11 12 13
require 'rspec'
 
describe "Behaviour" do
it "should pass" do
true.should eq true
end
 
it "should fail" do
true.should eq false
end
 
it "should pending"
end
View 01 example_spec.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
require 'rspec'
require 'rspec/core/formatters/json_formatter'
 
config = RSpec.configuration
json_formatter = RSpec::Core::Formatters::JsonFormatter.new(config.out)
 
# create reporter with json formatter
reporter = RSpec::Core::Reporter.new(json_formatter)
# set reporter for rspec configuration
config.instance_variable_set(:@reporter, reporter)
 
# execute rspec runner
# 'example_spec.rb' is the location of the spec file
RSpec::Core::Runner.run(['example_spec.rb'])
 
# output test result as json
# see example output in `rspec_json_formatter_result.rb`
puts json_formatter.output_hash
View 01 example_spec.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
{
:examples => [{:description => "should pass",
:full_description => "Behaviour should pass",
:status => "passed",
:file_path => "./my_spec.rb",
:line_number => 4
}, {:description => "should fail",
:full_description => "Behaviour should fail",
:status => "failed",
:file_path => "./my_spec.rb",
:line_number => 8,
:exception => {:class => "RSpec::Expectations::ExpectationNotMetError",
:message => "\nexpected:false\n got:true\n\n(compared using ==)\n",
:backtrace => ["/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/fail_with.rb:33:in `fail_with'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/handler.rb:31:in `handle_matcher'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/syntax.rb:53:in `should'", "/Users/jing/Documents/other/test/my_spec.rb:9:in `block (2 levels) in <top (required)>'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:114:in `instance_eval'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:114:in `block in run'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:254:in `with_around_each_hooks'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:111:in `run'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:388:in `block in run_examples'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:384:in `map'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:384:in `run_examples'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:369:in `run'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:28:in `block (2 levels) in run'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:28:in `map'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:28:in `block in run'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/reporter.rb:34:in `report'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:25:in `run'", "/Users/jing/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/runner.rb:80:in `run'", "runner.rb:19:in `<main>'"]
}
}, {:description => "should pending",
:full_description => "Behaviour should pending",
:status => "pending",
:file_path => "./my_spec.rb",
:line_number => 12
}],
:summary => {:duration => 0.001543,
:example_count => 3,
:failure_count => 1,
:pending_count => 1
},
:summary_line => "3 examples, 1 failure, 1 pending"
}

having a hard time getting this to work.

using config.out to initialize the JsonFormatter object results in this:

rspec_runner.rb:6:in `<main>': undefined method `out' for #<RSpec::Core::Configuration:0x007ff753856ea0> (NoMethodError)

replacing that with $stdout or any StringIO object works, but then I run into this:

/Users/jrobinson/.rvm/gems/ruby-1.9.3-p448/gems/rspec-core-3.0.3/lib/rspec/core/reporter.rb:63:in `start': undefined method `start_time' for #<RSpec::Core::Formatters::JsonFormatter:0x007fab5b920618> (NoMethodError)
    from /Users/jrobinson/.rvm/gems/ruby-1.9.3-p448/gems/rspec-core-3.0.3/lib/rspec/core/reporter.rb:52:in `report'
    from /Users/jrobinson/.rvm/gems/ruby-1.9.3-p448/gems/rspec-core-3.0.3/lib/rspec/core/runner.rb:108:in `run_specs'
    from /Users/jrobinson/.rvm/gems/ruby-1.9.3-p448/gems/rspec-core-3.0.3/lib/rspec/core/runner.rb:86:in `run'
    from /Users/jrobinson/.rvm/gems/ruby-1.9.3-p448/gems/rspec-core-3.0.3/lib/rspec/core/runner.rb:70:in `run'
    from rspec_runner.rb:14:in `<main>'

the code:

require 'rspec'
require 'rspec/core/formatters/json_formatter'

config = RSpec.configuration
config.color = false

output = StringIO.new

json_formatter = RSpec::Core::Formatters::JsonFormatter.new(output)
reporter =  RSpec::Core::Reporter.new(json_formatter)
config.instance_variable_set(:@reporter, reporter)

RSpec::Core::Runner.run(['./test_spec.rb'])
Owner

This should work:

require 'rspec'
require 'rspec/core/formatters/json_formatter'

config = RSpec.configuration

formatter = RSpec::Core::Formatters::JsonFormatter.new(config.output_stream)

# create reporter with json formatter
reporter =  RSpec::Core::Reporter.new(config)
config.instance_variable_set(:@reporter, reporter)

# internal hack
# api may not be stable, make sure lock down Rspec version
loader = config.send(:formatter_loader)
notifications = loader.send(:notifications_for, RSpec::Core::Formatters::JsonFormatter)


reporter.register_listener(formatter, *notifications)

RSpec::Core::Runner.run(['spec.rb'])

p formatter.output_hash

This looks cool! How about If I would want to test programatically multiple sites using identical specs but just changing some variables. Something like this =>

  describe "frontpage" do
      before(:each) do
        visit "http://#{hostname}/"
      end

      it "should contain title: #{title}" do
        expect(page).to have_title "#{title}"
      end
    end

Is this a bad idea? How would you make it happen?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.