diff --git a/README.rdoc b/README.rdoc index ece905f..fe665b1 100644 --- a/README.rdoc +++ b/README.rdoc @@ -139,6 +139,24 @@ You run your acceptance specs just like your regular specs. Individually... ...you can also do: $ rake spec:acceptance + +== RSpec & Metadata + +Steak scenarios are just regular RSpec examples with their metadata attribute +`:type` set to `:acceptance`. That's useful if you want to make sure you +include helpers or set hooks only for your acceptance specs and not for the +rest of the specs in your suite. + +You'd do it this way: + + RSpec.configure do |config| + # include MyHelpers module in every acceptance spec + config.include MyHelpers, :type => :acceptance + + config.before(:each, :type => :acceptance) do + # Some code to run before any acceptance spec + end + end == Resources diff --git a/lib/generators/steak/templates/acceptance_helper.rb b/lib/generators/steak/templates/acceptance_helper.rb index 5ca8c37..e2bb05e 100644 --- a/lib/generators/steak/templates/acceptance_helper.rb +++ b/lib/generators/steak/templates/acceptance_helper.rb @@ -7,24 +7,22 @@ config.mode = :rack end -module AppHelper +module Steak::Webrat + include Rack::Test::Methods + include Webrat::Methods + include Webrat::Matchers + def app Rails.application end end -RSpec.configure do |config| - config.include Rack::Test::Methods - config.include Webrat::Methods - config.include Webrat::Matchers - config.include AppHelper -end +RSpec.configuration.include Steak::Webrat, :type => :acceptance + <%- else -%> require 'capybara/rails' -RSpec.configure do |config| - config.include Capybara -end +RSpec.configuration.include Capybara, :type => :acceptance <%- end -%> # Put your acceptance spec helpers inside /spec/acceptance/support diff --git a/lib/generators/steak/templates/helpers.rb b/lib/generators/steak/templates/helpers.rb index d13a617..5d1de53 100644 --- a/lib/generators/steak/templates/helpers.rb +++ b/lib/generators/steak/templates/helpers.rb @@ -2,4 +2,4 @@ module HelperMethods # Put helper methods you need to be available in all tests here. end -RSpec.configuration.include(HelperMethods), :example_group => { :file_path => %r{\bspec/acceptance/} } +RSpec.configuration.include HelperMethods, :type => :acceptance diff --git a/lib/generators/steak/templates/paths.rb b/lib/generators/steak/templates/paths.rb index 46a23a9..f623f48 100644 --- a/lib/generators/steak/templates/paths.rb +++ b/lib/generators/steak/templates/paths.rb @@ -6,4 +6,4 @@ def homepage end end -RSpec.configuration.include(NavigationHelpers), :example_group => { :file_path => %r{\bspec/acceptance/} } +RSpec.configuration.include NavigationHelpers, :type => :acceptance diff --git a/lib/steak.rb b/lib/steak.rb index 34ea5ef..a3c8652 100644 --- a/lib/steak.rb +++ b/lib/steak.rb @@ -1,12 +1,22 @@ require 'rspec/core' -class RSpec::Core::ExampleGroup - class << self - alias scenario example - alias background before +module Steak + module AcceptanceExampleGroup + def self.included(base) + base.instance_eval do + alias scenario example + alias background before + end + end end end module RSpec::Core::ObjectExtensions - alias feature describe + def feature(*args, &block) + args << {} unless args.last.is_a?(Hash) + args.last.update :type => :acceptance, :steak => true + describe(*args, &block) + end end + +RSpec.configuration.include Steak::AcceptanceExampleGroup, :type => :acceptance diff --git a/spec/acceptance/basic_spec.rb b/spec/acceptance/basic_spec.rb index f6119d5..f5c06d3 100644 --- a/spec/acceptance/basic_spec.rb +++ b/spec/acceptance/basic_spec.rb @@ -47,4 +47,32 @@ output = run_spec spec_file output.should =~ /1 example, 0 failures/ end + + scenario "Acceptance spec metadata" do + spec_file = create_spec <<-SPEC + require '#{File.dirname(__FILE__) + "/../../lib/steak"}' + feature "Minimal spec" do + scenario "should have acceptance metadata" do + example.metadata[:type].should == :acceptance + example.metadata[:steak].should be_true + end + end + SPEC + output = run_spec spec_file + output.should =~ /1 example, 0 failures/ + end + + scenario "Regular specs doesn't have acceptance metadata" do + spec_file = create_spec <<-SPEC + require '#{File.dirname(__FILE__) + "/../../lib/steak"}' + describe "Regular spec" do + it "should not have acceptance metadata" do + example.metadata[:type].should_not == :acceptance + example.metadata[:steak].should_not be_true + end + end + SPEC + output = run_spec spec_file + output.should =~ /1 example, 0 failures/ + end end diff --git a/spec/acceptance/rails_spec.rb b/spec/acceptance/rails_spec.rb index 123acbc..c7daf5d 100644 --- a/spec/acceptance/rails_spec.rb +++ b/spec/acceptance/rails_spec.rb @@ -38,6 +38,21 @@ output.should =~ /1 example, 1 failure/ end + scenario "Path helpers are available" do + rails_app = create_rails_app + spec_file = create_spec :path => rails_app + "/spec/acceptance", + :content => <<-SPEC + require File.dirname(__FILE__) + "/acceptance_helper.rb" + feature "Minimal spec" do + scenario "First scenario" do + homepage.should == "/" + end + end + SPEC + output = run_spec spec_file, File.join(File.dirname(spec_file), '../..') + output.should =~ /1 example, 0 failures/ + end + scenario "Running rake stats" do rails_app = create_rails_app