multiple rspec files running!

This commit is contained in:
Nick Gauthier 2010-04-03 20:32:00 -04:00
parent c1c44f89d2
commit 55fb81f5de
6 changed files with 84 additions and 49 deletions

View File

@ -29,6 +29,15 @@ module Hydra #:nodoc:
# the connectivity of the IO
end
end
# The runner forks to run rspec messages
# so that specs don't get rerun. It uses
# this message to report the results. See
# Runner::run_rspec_file.
class RSpecResult < Hydra::Message
# the output of the spec
attr_accessor :output
end
end
end
end

View File

@ -35,10 +35,12 @@ module Hydra #:nodoc:
trace "Running file: #{file}"
output = ""
if file =~ /.rb$/
output = run_ruby_file(file)
if file =~ /_spec.rb$/
output = run_rspec_file(file)
elsif file =~ /.feature$/
output = run_cucumber_file(file)
else
output = run_test_unit_file(file)
end
output = "." if output == ""
@ -75,15 +77,6 @@ module Hydra #:nodoc:
end
end
# Run a ruby file (ending in .rb)
def run_ruby_file(file)
if file =~ /_spec.rb$/
return run_rspec_file(file)
else
return run_test_unit_file(file)
end
end
# Run all the Test::Unit Suites in a ruby file
def run_test_unit_file(file)
begin
@ -110,31 +103,35 @@ module Hydra #:nodoc:
# run all the Specs in an RSpec file (NOT IMPLEMENTED)
def run_rspec_file(file)
# TODO:
# 1. do some of this only once, like the requires and stuff
# 2. fork the file loading so that it doesn't get re-run
# 3. test that running two files doesn't re-run the first
# to test 2. above. Like for cucumber
# 4. try this on a real rspec project
# pull in rspec
begin
require 'spec/autorun'
require 'hydra/spec/hydra_formatter'
rescue LoadError => ex
return ex.to_s
end
options = Spec::Runner.options
require 'spec/runner/formatter/progress_bar_formatter'
require 'hydra/spec/hydra_formatter'
hydra_output = StringIO.new
options.formatters = [Spec::Runner::Formatter::HydraFormatter.new(options.formatter_options, hydra_output)]
require file
options.run_examples
hydra_output.rewind
output = hydra_output.read.chomp
output = "" if output == "."
# we have to run the rspec test in a sub-process
# this is because rspec runs all the tests that
# have been required, so if we kept requiring the
# files they'd get run over and over
pipe = Hydra::Pipe.new
pid = SafeFork.fork do
pipe.identify_as_child
options = Spec::Runner.options
hydra_output = StringIO.new
options.formatters = [Spec::Runner::Formatter::HydraFormatter.new(options.formatter_options, hydra_output)]
require file
options.run_examples
hydra_output.rewind
output = hydra_output.read.chomp
output = "" if output == "."
pipe.write RSpecResult.new(:output => output)
pipe.close
end
pipe.identify_as_parent
output = pipe.gets
Process.wait pid
return output
#return `spec #{File.expand_path(file)}`
end
# run all the scenarios in a cucumber feature file

View File

@ -1,3 +1,5 @@
require 'spec/autorun'
require 'spec/runner/formatter/progress_bar_formatter'
module Spec
module Runner
class Options

View File

@ -0,0 +1,9 @@
require 'tmpdir'
context "file writing" do
it "writes to a file" do
File.open(File.join(Dir.tmpdir, 'alternate_hydra_test.txt'), 'a') do |f|
f.write "HYDRA"
end
end
end

View File

@ -37,29 +37,43 @@ class RunnerTest < Test::Unit::TestCase
Process.wait(child)
end
should "run two cucumber tests" do
puts "THE FOLLOWING WARNINGS CAN BE IGNORED"
puts "It is caused by Cucumber loading all rb files near its features"
should "run two rspec tests" do
runner = Hydra::Runner.new(:io => File.new('/dev/null', 'w'))
runner.run_file(cucumber_feature_file)
runner.run_file(rspec_file)
assert File.exists?(target_file)
assert_equal "HYDRA", File.read(target_file)
FileUtils.rm_f(target_file)
runner.run_file(alternate_cucumber_feature_file)
runner.run_file(alternate_rspec_file)
assert File.exists?(alternate_target_file)
assert_equal "HYDRA", File.read(alternate_target_file)
puts "END IGNORABLE OUTPUT"
assert !File.exists?(target_file)
end
should "run an rspec test" do
runner = Hydra::Runner.new(:io => File.new('/dev/null', 'w'))
runner.run_file(rspec_file)
assert File.exists?(target_file)
assert_equal "HYDRA", File.read(target_file)
should "run two cucumber tests" do
# because of all the crap cucumber pulls in
# we run this in a fork to not contaminate
# the main test environment
pid = Process.fork do
puts "THE FOLLOWING WARNINGS CAN BE IGNORED"
puts "It is caused by Cucumber loading all rb files near its features"
runner = Hydra::Runner.new(:io => File.new('/dev/null', 'w'))
runner.run_file(cucumber_feature_file)
assert File.exists?(target_file)
assert_equal "HYDRA", File.read(target_file)
FileUtils.rm_f(target_file)
runner.run_file(alternate_cucumber_feature_file)
assert File.exists?(alternate_target_file)
assert_equal "HYDRA", File.read(alternate_target_file)
assert !File.exists?(target_file)
puts "END IGNORABLE OUTPUT"
end
Process.wait pid
end
should "be able to run a runner over ssh" do

View File

@ -27,6 +27,10 @@ class Test::Unit::TestCase
File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', 'write_file_spec.rb'))
end
def alternate_rspec_file
File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', 'write_file_alternate_spec.rb'))
end
def cucumber_feature_file
File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', 'features', 'write_file.feature'))
end