September 4, 2010
Posted by roadburn
Testing Spree with cucumber + spork + autotest + pickle + factory girl
Copy this from the spree root folder into your app
1 2 3 | spree-0.11.0/features to yourapp/features |
Edit features/support/env.rb
1 2 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 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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | ENV["RAILS_ENV"] ||= "cucumber" require 'rubygems' require 'spork' Spork.prefork do require File.expand_path(File.dirname(__FILE__) + '/../../config/environment') require 'cucumber/formatter/unicode' # Remove this line if you don't want Cucumber Unicode support require 'cucumber/rails/world' require 'cucumber/rails/active_record' require 'cucumber/web/tableish' require 'capybara/rails' require 'capybara/cucumber' require 'capybara/session' require 'cucumber/rails/capybara_javascript_emulation' # Lets you click links with onclick javascript handlers without using @culerity or @javascript # Capybara defaults to XPath selectors rather than Webrat's default of CSS3. In # order to ease the transition to Capybara we set the default here. If you'd # prefer to use XPath just remove this line and adjust any selectors in your # steps to use the XPath syntax. Capybara.default_selector = :css Dir.glob(SPREE_ROOT + '/db/default/*.{yml,csv,rb}').each do |file| Fixtures.create_fixtures(SPREE_ROOT + '/db/default', File.basename(file, '.*')) end Dir.glob(SPREE_ROOT + '/test/fixtures/*.{yml,csv,rb}').each do |file| Fixtures.create_fixtures(SPREE_ROOT + '/test/fixtures', File.basename(file, '.*')) end require 'faker' require 'factory_girl' [ File.join(SPREE_ROOT, 'test', 'factories', '*.rb'), File.join(RAILS_ROOT, 'vendor', 'extensions', '*', '{test,spec}', 'factories', '*.rb') ].each do |path| Dir.glob(path).each { |factory| require factory } end require 'factory_girl/step_definitions' Zone.class_eval do def self.global find_by_name("GlobalZone") || Factory(:global_zone) end end Product.class_eval do def taxon=(taxon_name) taxonomy = Taxonomy.find_or_create_by_name("Category") taxon = Taxon.find_or_create_by_name_and_taxonomy_id(taxon_name, taxonomy) self.taxons << taxon end end ShippingMethod.create(:name => "UPS Ground", :zone => Zone.global, :calculator => Calculator::FlatRate.new) coupon = Coupon.create(:code => "SPREE", :description => "$5 off any order", :combine => false, :calculator => Calculator::FlatRate.new) coupon.calculator.update_attribute(:preferred_amount, 5) end Spork.each_run do # If you set this to false, any error raised from within your app will bubble # up to your step definition and out to cucumber unless you catch it somewhere # on the way. You can make Rails rescue errors and render error pages on a # per-scenario basis by tagging a scenario or feature with the @allow-rescue tag. # # If you set this to true, Rails will rescue all errors and render error # pages, more or less in the same way your application would behave in the # default production environment. It's not recommended to do this for all # of your scenarios, as this makes it hard to discover errors in your application. ActionController::Base.allow_rescue = false # If you set this to true, each scenario will run in a database transaction. # You can still turn off transactions on a per-scenario basis, simply tagging # a feature or scenario with the @no-txn tag. If you are using Capybara, # tagging with @culerity or @javascript will also turn transactions off. # # If you set this to false, transactions will be off for all scenarios, # regardless of whether you use @no-txn or not. # # Beware that turning transactions off will leave data in your database # after each scenario, which can lead to hard-to-debug failures in # subsequent scenarios. If you do this, we recommend you create a Before # block that will explicitly put your database in a known state. Cucumber::Rails::World.use_transactional_fixtures = true # How to clean your database when transactions are turned off. See # http://github.com/bmabey/database_cleaner for more info. require 'database_cleaner' DatabaseCleaner.strategy = :truncation end |
config/cucumber.yml
1 2 3 4 5 6 7 8 9 | <% rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : "" rerun_opts = rerun.to_s.strip.empty? ? "--format progress features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}" std_opts = "#{rerun_opts} --format rerun --out rerun.txt --strict --tags ~@wip" %> default: --drb <%= std_opts %> wip: --drb --tags @wip:3 --wip features autotest: --drb features --guess --format 'pretty' --color autotest-all: --drb features --guess --format 'progress' --color |
config/environments/cucumber.rb
1 2 | ENV['AUTOFEATURE'] = "true" ENV['RSPEC'] = "true" |
config/database.yml
1 2 | cucumber: <<: *test |
Run your tests!
1 2 | $ spork cuc $ autotest |
Resources
http://groups.google.com/group/spree-user/browse_thread/thread/81b006af48d3166d