module Covet::TestRunners::Rspec

Public Class Methods

cmdline_for_run_list(run_list) click to toggle source
# File lib/covet/test_runners/rspec.rb, line 73
def self.cmdline_for_run_list(run_list)
  require 'rspec/core/rake_task'
  files = run_list.map { |double| double[1] }
  files.uniq!
  file_list = files.join(' ')
  old_spec_env = ENV['SPEC']
  begin
    ENV['SPEC'] = file_list
    rspec_rake_task = RSpec::Core::RakeTask.new(:spec) do |t|
    end
  ensure
    ENV['SPEC'] = old_spec_env
  end
  # XXX: is this right for all recent versions of rake?
  # TODO: try to figure out how to get test method names
  rspec_rake_task.send(:spec_command)
end
hook_into_test_methods!() click to toggle source
# File lib/covet/test_runners/rspec.rb, line 9
def self.hook_into_test_methods!
  if @hooked
    warn "Warning - Covet.register_coverage_collection! called multiple times"
    return
  end
  gem 'rspec'
  require 'rspec'

  ::RSpec.configuration.after(:suite) do
    Covet.log_collection.finish!
  end

  run_num = @run_num
  skips = @skips
  failures = @failures

  ::RSpec.configuration.around(:each) do |test|
    if run_num == 0
      base_coverage = CovetCoverage.peek_result
      base_coverage = Covet.normalize_coverage_info(base_coverage)
      if base_coverage.empty?
        warn "Warning - covet is not properly set up, as it must be required " \
          "before other libraries to properly work.\nIf it isn't already, try " \
          "adding\n  require 'covet'\nas the first thing in your test helper file."
      end
      Covet::BASE_COVERAGE.update base_coverage
      # TODO: save Random::DEFAULT.seed in run log file if Covet.options[:test_order] == :random_seeded,
      # then we can run the methods in the same order as before.
      Covet.log_collection << ['base', base_coverage]
    end

    run_num += 1
    before = CovetCoverage.peek_result
    test.call
    rspec_metadata = test.metadata

    # TODO: figure out if failed or skipped, and break out of block if it did
    #
    # XXX: is this right for all recent versions of rake?
    file = rspec_metadata[:file_path].sub(%r{\A\./}, '') # remove leading './'
    line = rspec_metadata[:line_number]

    after = CovetCoverage.peek_result

    before_orig = Covet.normalize_coverage_info(before)
    if Covet::BASE_COVERAGE.any?
      before = Covet.diff_coverages(Covet::BASE_COVERAGE, before_orig)
    end
    after_orig = Covet.normalize_coverage_info(after)
    after = Covet.diff_coverages(before, after_orig)
    if run_num > 1
      if [:random_seeded, :ordered].include?(Covet.options[:test_order])
        Covet::BASE_COVERAGE.update(after_orig)
      end
    end

    if after == before
      after = nil
    end
    Covet.log_collection << ["#{file}:#{line}", after]
  end
  @hooked = true
end