Class: RspecTestData::Setup

Inherits:
Object
  • Object
show all
Defined in:
lib/rspec_test_data/rspec_setup.rb

Instance Method Summary collapse

Constructor Details

#initialize(example) ⇒ Setup

Returns a new instance of Setup.



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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/rspec_test_data/rspec_setup.rb', line 3

def initialize(example)
  debug = ->(*) {}

  if example.[:debug_test_data] || ENV["DEBUG_TEST_DATA"] == "true"
    debug = ->(*args) {
      first_message,rest = args[0], args[1..-1]
      puts *([ "[ debug_test_data ] #{args[0]}" ] + args[1..-1])
    }
  end

  use_test_data = example.[:test_data].nil? || example.[:test_data] == true
  if !use_test_data
    debug.("Spec opted out of test_data (#{example.description})")
    return
  end

  test_data_file = example.file_path.gsub(/_spec\.rb$/,".test_data.rb")

  if !File.exist?(test_data_file)
    debug.("Can't find #{test_data_file}, so assuming none to load")
    return
  end

  require test_data_file

  test_data_class_name = "RspecTestData::" + example.file_path.gsub(/^.\/spec\//,"").gsub(/_spec\.rb$/,"").classify
  test_data_class = begin
                      debug.("Loading '#{test_data_class_name}' as the test data class name")
                      test_data_class_name.constantize
                    rescue NameError => ex
                      raise "Expected '#{test_data_file}' to define '#{test_data_class_name}', but it does not: #{ex.message}"
                    end

  example.example_group.let(:test_data_class) { test_data_class }

  if example.example_group.method_defined?(:test_data_override)
    debug.("test_data_override for '#{example.description}'")
    example.example_group.let(:test_data) { test_data_override }
  else
    if example.[:test_data_eager] == true
      test_data = test_data_class.new
      example.example_group.let(:test_data) { test_data }
    else
      example.example_group.let(:test_data) { test_data_class.new }
    end
  end

end