Rails 3 and Rspec 2: Smooth and super fast
Gemfile
# code omitted
group :development, :test do
gem "faker"
gem "populator"
end
group :test do
gem "capybara"
gem "database_cleaner"
gem "email_spec"
gem "factory_girl_rails"
gem "fuubar"
gem "guard-spork"
gem "guard-rspec"
gem "growl"
gem "rb-fsevent"
gem "launchy"
gem "rspec-rails"
gem "spork-rails"
end
Guardfile
#!/usr/bin/env ruby
require "active_support/core_ext/string"
interactor :off
guard "spork", rspec_env: { RAILS_ENV: "test" } do
watch("config/application.rb")
watch("config/environment.rb")
watch("config/environments/test.rb")
watch(%r{^config/initializers/.+\.rb$})
watch("Gemfile")
watch("Gemfile.lock")
watch("spec/spec_helper.rb")
watch(%r{^spec/support/.+\.rb$})
end
guard "rspec", version: 2, cli: "--color --format Fuubar --fail-fast --drb" do
watch(%r{^spec/.+_spec\.rb$})
watch("config/routes.rb") { "spec/routing" }
watch("app/controllers/application_controller.rb") { "spec/controllers" }
watch(%r{^app/models/(.+)\.rb$}) { |m| ["spec/controllers/#{m[1].pluralize}_controller_spec.rb", "spec/models/#{m[1]}_spec.rb", "spec/factories/#{m[1]}.rb"] }
watch(%r{^spec/factories/(.+)\.rb$}) { |m| ["spec/controllers/#{m[1].pluralize}_controller_spec.rb"] }
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb"] }
end
spec/spec_helper.rb
Spork.prefork do
ENV["RAILS_ENV"] ||= "test"
require File.expand_path("../../config/environment", __FILE__)
require "rspec/rails"
require "capybara/rspec"
require "capybara/rails"
require "email_spec"
require "sidekiq/testing"
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
RSpec.configure do |config|
# includes
include ActionDispatch::TestProcess
# rspec includes
config.include(EmailSpec::Helpers)
config.include(EmailSpec::Matchers)
config.include(Devise::TestHelpers, type: :controller)
# extends
config.extend(ControllerMacros, type: :controller)
config.extend(UploadMacros)
# hooks
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
config.after(:all) do
UploadMacros::cleanup if Rails.env.test?
end
end
end
Spork.each_run do
Dir[Rails.root.join("app/models/*.rb")].each { |f| require f }
FactoryGirl.reload
end
spec/support/controller_macros.rb
module ControllerMacros
def login_admin
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:admin]
sign_in FactoryGirl.create(:user, :with_group_admin)
end
end
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
user = FactoryGirl.create(:user, :with_groups)
sign_in user
end
end
end
spec/support/upload_macros.rb
module UploadMacros
def self.upload(opts)
fixture_file_upload("#{Rails.root}/spec/files/#{opts[:file]}", opts[:type])
end
def self.cleanup
FileUtils.rm_rf("#{Rails.root}/public/uploads/test")
end
end
now just run and enjoy :)
guard -cWritten by Eduardo Martines
Related protips
Have a fresh tip? Share with Coderwall community!
Post
Post a tip
Best
#Ruby
Authors
Filed Under
Did you know?
Guarding a web app includes the code that arrives in the browser, not only the code in source control. Tags and dependencies can change in production between deploys.
Security insights from Cside
Sponsored by #native_company# — Learn More
#native_title#
#native_desc#