Class: VCR::CucumberTags

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

Overview

Provides integration with Cucumber using tags.

Instance Method Summary collapse

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>)

    the cucumber scenario tags

  • options ((optional) Hash)

    the cassette options. Specify :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
# 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)
        feature = scenario.respond_to?(:scenario_outline) ? scenario.scenario_outline.feature : scenario.feature
        name = feature.name.split("\n").first
        name << "/#{scenario.scenario_outline.name}" if scenario.respond_to?(:scenario_outline)
        name << "/#{scenario.name.split("\n").first}"
        name
      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