Class: VCR::CucumberTags

Inherits:
Object
  • Object
show all
Defined in:
lib/vcr/test_frameworks/cucumber.rb

Overview

Provides integration with Cucumber using tags.

Defined Under Namespace

Classes: ScenarioNameBuilder

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(main_object) ⇒ CucumberTags

Returns a new instance of CucumberTags.



19
20
21
# File 'lib/vcr/test_frameworks/cucumber.rb', line 19

def initialize(main_object)
  @main_object = main_object
end

Class Method Details

.add_tag(tag) ⇒ Object



11
12
13
# File 'lib/vcr/test_frameworks/cucumber.rb', line 11

def add_tag(tag)
  @tags << tag
end

.tagsObject



6
7
8
# File 'lib/vcr/test_frameworks/cucumber.rb', line 6

def tags
  @tags.dup
end

Instance Method Details

#tags(*tag_names) ⇒ Object Also known as: tag

Adds ‘Before` and `After` cucumber hooks for the named tags that will cause a VCR cassette to be used for scenarios with matching tags.

Parameters:

  • tag_names (Array<String,Hash>)

    the cucumber scenario tags. If the last argument is a hash it is treated as cassette options.

    - `:use_scenario_name => true` to automatically name the
      cassette according to the scenario name.
    


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/vcr/test_frameworks/cucumber.rb', line 30

def tags(*tag_names)
  original_options = tag_names.last.is_a?(::Hash) ? tag_names.pop : {}
  tag_names.each do |tag_name|
    tag_name = "@#{tag_name}" unless tag_name =~ /\A@/

    # It would be nice to use an Around hook here, but
    # cucumber has a bug: background steps do not run
    # within an around hook.
    # https://gist.github.com/652968
    @main_object.Before(tag_name) do |scenario|
      options = original_options.dup

      cassette_name = if options.delete(:use_scenario_name)
        if scenario.respond_to?(:outline?) && scenario.outline?
          ScenarioNameBuilder.new(scenario).cassette_name
        elsif scenario.respond_to?(:scenario_outline)
          [ scenario.scenario_outline.feature.name.split("\n").first,
            scenario.scenario_outline.name,
            scenario.name.split("\n").first
          ].join("/")
        elsif scenario.respond_to?(:feature)
          [ scenario.feature.name.split("\n").first,
            scenario.name.split("\n").first
          ].join("/")
        elsif scenario.location.lines.min == scenario.location.lines.max
          # test case from a regular scenario in cucumber version 4
          [ scenario.location.file.split("/").last.split(".").first,
            scenario.name.split("\n").first
          ].join("/")
        else
          # test case from a scenario with examples ("scenario outline") in cucumber version 4
          [ scenario.location.file.split("/").last.split(".").first,
            scenario.name.split("\n").first,
            "Example at line #{scenario.location.lines.max}"
          ].join("/")
        end
      else
        "cucumber_tags/#{tag_name.gsub(/\A@/, '')}"
      end

      VCR.insert_cassette(cassette_name, options)
    end

    @main_object.After(tag_name) do |scenario|
      VCR.eject_cassette(:skip_no_unused_interactions_assertion => scenario.failed?)
    end

    self.class.add_tag(tag_name)
  end
end