Spork, RSpec, and Guard - 01 Mar 2012
Spork is a great tool for saving time when it comes to testing your Rails application. Normally when tests are run, you need to wait for the Rails application to load. Spork will cut out that delay.
Adding Spork support for RSpec and Guard is pretty simple, to get started add the following gems to your Gemfile:
group :test do gem 'spork' gem 'guard-spork' end
Make sure you run the bundle command, and you’re now ready to set up your Spork install. Enter spork --bootstrap into the terminal to add Spork to your spec_helper.rb file. You’ll then need to edit your spec_helper file and place most of your code into Spork.prefork.
Here’s an example spec_helper.rb file:
require 'rubygems'
require 'spork'
Spork.prefork do
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'capybara/rspec'
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|
config.mock_with :rspec
config.use_transactional_fixtures = true
config.include Factory::Syntax::Methods
config.include UserMacros
end
end
Spork.each_run do
end
If you’re using guard, you’ll want to run bundle exec guard init spork to add Spork to your guardfile. After you run the command, you need to edit your guardfile and place the Spork block at the top of the file. You’ll also want to add cli: '--drb' to guard ‘rspec’.
Here’s an example guardfile:
# A sample Guardfile # More info at https://github.com/guard/guard#readme guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAILS_ENV' => 'test' } do watch('config/application.rb') watch('config/environment.rb') watch(%r{^config/environments/.+\.rb$}) watch(%r{^config/initializers/.+\.rb$}) watch('Gemfile') watch('Gemfile.lock') watch('spec/spec_helper.rb') { :rspec } watch('test/test_helper.rb') { :test_unit } watch(%r{features/support/}) { :cucumber } watch(%r{^spec/support/.+\.rb$}) end guard 'rspec', :version => 2, cli: '--drb' do watch(%r{^spec/.+_spec\.rb$}) watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" } watch('spec/spec_helper.rb') { "spec" } # Rails example watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" } watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" } watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb" } watch(%r{^spec/support/(.+)\.rb$}) { "spec" } watch('app/controllers/application_controller.rb') { "spec/controllers" } # Capybara request specs watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" } end
You’re all set and ready to run guard.