class VCR::CucumberTags

Provides integration with Cucumber using tags.

def add_tag(tag)

Other tags:
    Private: -
def add_tag(tag)
  @tags << tag
end

def initialize(main_object)

Other tags:
    Private: -
def initialize(main_object)
  @main_object = main_object
end

def tags

Other tags:
    Private: -
def tags
  @tags.dup
end

def tags(*tag_names)

Parameters:
  • tag_names (Array) -- the cucumber scenario tags. If
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