Skip to content

@activars /01 example_spec.rb
Last active

Embed URL

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
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
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
{
: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"
}
@jakerobinson

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'])
@activars
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
@onnimonni

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.