2

UPDATED 11:10am OCT 7th 2014

orginal

_I am unsure how to set up spork with rails_helper and spec_helper. I am also using guard in my stack._

I have tried different combos, and I am still having difficulty installing it.

Railscasts and Tuts+ were no help ( this time )

anyone know of an easier way to set this up?

:Gemfile

source 'https://rubygems.org'

gem 'coffee-rails', '~> 4.0.0'
gem 'jbuilder', '~> 2.0'
gem 'jquery-rails'
gem 'pg'
gem 'rails', '4.1.6'
gem 'sass-rails', '~> 4.0.3'
gem 'sdoc', '~> 0.4.0',          group: :doc
gem 'simple_form'
gem 'spring',        group: :development
gem 'turbolinks'
gem 'uglifier', '>= 1.3.0'

group :development, :test do
  gem 'better_errors'
  gem 'binding_of_caller'
  gem 'capybara'
  gem 'factory_girl_rails'
  gem 'growl'
  gem 'guard-rspec'
  gem 'guard-spork'
  gem 'meta_request'
  gem 'pry-rails'
  gem 'rspec-rails'
  gem 'spork','1.0.0rc0'
  gem 'spork-rails'
  gem 'terminal-notifier-guard'
end

my rails_helper.rb

ENV["RAILS_ENV"] ||= 'test'
require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!
end

my spec_helper.rb

require 'rubygems'
require 'spork'

Spork.prefork do
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'

  ActiveRecord::Migration.maintain_test_schema!

  RSpec.configure do |config|
    config.fixture_path = "#{::Rails.root}/spec/fixtures"
    config.use_transactional_fixtures = true
    config.infer_spec_type_from_file_location!
  end

end

Spork.each_run do
  # This code will be run each time you run your specs.

end

I have set this up again. and now it takes for ever for the load to happen. Its as if thet rails environment isn't even loaded.

Thoughts?

R.J. Robinson
  • 2,180
  • 3
  • 21
  • 33
  • Can you provide some more information about your setup? What errors are you getting? And please add any relevant code/gemfile. – Tom Kadwill Oct 06 '14 at 07:07
  • @7stud . Thanks. i have a better understanding now. However, i am have ing some issues with the bundler _Bundler could not find compatible versions for gem "spork": In Gemfile: spork-rails (>= 0) ruby depends on spork (>= 1.0rc0) ruby guard-spork (>= 0) ruby depends on spork (0.9.2)_ Should i just use the older spork? – R.J. Robinson Oct 07 '14 at 14:33
  • No. I went through that too. In your Gemfile, you have to get rid of any version number after the gems mentioned in the error message (not all the gems in the error message will necessarly be in your Gemfile--so just handle the ones that are); then do `$ bundle update`. As far as I can tell, rspec3 requires newer versions of a lot of gems. Keep doing that until you don't get any more of those errors, **or just look at the Gemfile I posted and look at which gems don't have a version number.** – 7stud Oct 07 '14 at 18:17
  • I just read that Rails now includes something called Spring, which serves the same purpose as Spork. Setup explained here: http://girders.org/blog/2014/02/06/setup-rails-41-spring-rspec-and-guard/ – 7stud Oct 08 '14 at 01:22
  • **Thanks!** I was able to get spork up and running after playing with it for a little while! However, I also found spring. Set up was less difficult, but yea. Its up and running! Thanks again for all of your help. – R.J. Robinson Oct 08 '14 at 14:50

1 Answers1

2

I was able to get guard and spork working with rspec3. Here are the files I used:

my_rails_project/.rspec (created by rails generate rspec:install):

--color
--require spec_helper

my_rails_project/spec/rails_helper.rb (created by rails generate rspec:install):

# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'

# Add additional requires below this line. Rails is not loaded until this point!

# Requires supporting ruby files with custom matchers and macros, etc, in
# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
# run as spec files by default. This means that files in spec/support that end
# in _spec.rb will both be required and run as specs, causing the specs to be
# run twice. It is recommended that you do not name files matching this glob to
# end with _spec.rb. You can configure this pattern with the --pattern
# option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
#
# The following line is provided for convenience purposes. It has the downside
#
# of increasing the boot-up time by auto-requiring all files in the support
# directory. Alternatively, in the individual `*_spec.rb` files, manually
# require only the support files necessary.
#
# Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

# Checks for pending migrations before tests are run.
# If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.check_pending!

RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = true

  # RSpec Rails can automatically mix in different behaviours to your tests
  # based on their file location, for example enabling you to call `get` and
  # `post` in specs under `spec/controllers`.
  #
  # You can disable this behaviour by removing the line below, and instead
  # explicitly tag your specs with their type, e.g.:
  #
  #     RSpec.describe UsersController, :type => :controller do
  #       # ...
  #     end
  #
  # The different available types are documented in the features, such as in
  # https://relishapp.com/rspec/rspec-rails/docs
  config.infer_spec_type_from_file_location!
end

my_rails_project/spec/spec_helper.rb (created by rails generate rspec:install):

require 'rubygems'
require 'spork'
#uncomment the following line to use spork with the debugger
#require 'spork/ext/ruby-debug'

Spork.prefork do
  # Loading more in this block will cause your tests to run faster. However,
  # if you change any configuration or code from libraries loaded here, you'll
  # need to restart spork for it take effect.

  # This file is copied to spec/ when you run 'rails generate rspec:install'
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'
  #require 'rspec/autorun'  #Me: This line produced a deprecation warning in the middle of test output

  # Requires supporting ruby files with custom matchers and macros, etc,
  # in spec/support/ and its subdirectories.
  Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

  # Checks for pending migrations before tests are run.
  # If you are not using ActiveRecord, you can remove this line.
  ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)

  RSpec.configure do |config|
    # ## Mock Framework
    #
    # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
    #
    # config.mock_with :mocha
    # config.mock_with :flexmock
    # config.mock_with :rr

    # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
    config.fixture_path = "#{::Rails.root}/spec/fixtures"

    # If you're not using ActiveRecord, or you'd prefer not to run each of your
    # examples within a transaction, remove the following line or assign false
    # instead of true.
    config.use_transactional_fixtures = true

    # If true, the base class of anonymous controllers will be inferred
    # automatically. This will be the default behavior in future versions of
    # rspec-rails.
    config.infer_base_class_for_anonymous_controllers = false

    # Run specs in random order to surface order dependencies. If you find an
    # order dependency and want to debug it, you can fix the order by providing
    # the seed, which is printed after each run.
    #     --seed 1234
    config.order = "random"

    #Added by ror_tut
    config.include Capybara::DSL
  end
end

Spork.each_run do
  # This code will be run each time you run your specs.

end

my_rails_project/Guardfile:
source: Ruby on Rails Tutorial (Hartl) with changes made according to these posts:

1) Guard Rspec :cli option is deprecated, change to :cmd option
2) spork 0.9.2 and rspec 3.0.0 = uninitialized constant RSpec::Core::CommandLine (NameError)

# A sample Guardfile
# More info at https://github.com/guard/guard#readme
require 'active_support/inflector'

guard 'rspec', all_after_pass: false, cmd: 'rspec' 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/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
  watch(%r{^spec/support/(.+)\.rb$})                  { "spec" }
  watch('config/routes.rb')                           { "spec/routing" }

# Custom Rails Tutorial specs
  watch(%r{^app/controllers/(.+)_(controller)\.rb$}) do |m|
    ["spec/routing/#{m[1]}_routing_spec.rb",
     "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb",
     "spec/acceptance/#{m[1]}_spec.rb",
     (m[1][/_pages/] ? "spec/requests/#{m[1]}_spec.rb" :
                       "spec/requests/#{m[1].singularize}_pages_spec.rb")]
  end
  watch(%r{^app/views/(.+)/}) do |m|
    (m[1][/_pages/] ? "spec/requests/#{m[1]}_spec.rb" :
                      "spec/requests/#{m[1].singularize}_pages_spec.rb")
  end
  watch(%r{^app/controllers/sessions_controller\.rb$}) do |m|
    "spec/requests/authentication_pages_spec.rb"
  end

  #Rails example continued...
  watch('app/controllers/application_controller.rb')  { "spec/controllers" }

  # Capybara features specs
  watch(%r{^app/views/(.+)/.*\.(erb|haml)$})          { |m| "spec/features/#{m[1]}_spec.rb" }

  # Turnip features and steps
  watch(%r{^spec/acceptance/(.+)\.feature$})
  watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$})   { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
end


guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, 
               :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') { :rspec }
  watch('test/test_helper.rb') { :test_unit }
  watch(%r{features/support/}) { :cucumber }
end

Then in your files that contain the specs, e.g. my_rails_projects/spec/requests/static_pages_spec.rb, use the following require:

require 'rails_helper'

Notice that rails_helper.rb has the line:

require 'rspec_helper.rb'

...so you get both files with require rails_helper.

my_rails_project/Gemfile:

source 'https://rubygems.org'
ruby '2.0.0'
#ruby-gemset=sample_app2_gems

gem 'rails', '4.0.8'
gem 'pg', '0.15.1'source 'https://rubygems.org'
ruby '2.0.0'
#ruby-gemset=sample_app2_gems

gem 'rails', '4.0.8'
gem 'pg', '0.15.1'  #The version in rails tutorial Gemfile, latest is:
#gem 'pg', '0.17.1'

#For Bootstrap css
gem 'bootstrap-sass', '2.3.2.0'
gem 'sprockets', '2.11.0'
gem 'bcrypt-ruby', '3.1.2'

group(:development, :test) do
  #gem 'sqlite3', '1.3.8'
  #gem 'rspec-rails', '2.13.1'
  gem 'rspec-rails', '~>3.0'
  gem 'guard-rspec'
  gem 'spork-rails'
  gem 'guard-spork' 
  gem 'childprocess', '0.3.6'
  gem 'factory_girl_rails', '4.2.0'
end

group :test do
  gem 'selenium-webdriver', '2.35.1'
  gem 'capybara'
  gem 'growl', '1.0.3'
end

gem 'sass-rails', '4.0.3'
gem 'uglifier', '2.1.1'
gem 'coffee-rails', '4.0.1'
gem 'jquery-rails', '3.0.4'
gem 'turbolinks', '1.1.1'
gem 'jbuilder', '1.0.2'

group :doc do
  gem 'sdoc', '0.3.20', require: false
end

group :production do
  gem 'rails_12factor', '0.0.2'
end


#gem 'pg', '0.17.1'

#For Bootstrap css
gem 'bootstrap-sass', '2.3.2.0'
gem 'sprockets', '2.11.0'
gem 'bcrypt-ruby', '3.1.2'

group(:development, :test) do
  #gem 'sqlite3', '1.3.8'
  #gem 'rspec-rails', '2.13.1'
  gem 'rspec-rails', '~>3.0'
  gem 'guard-rspec'
  gem 'spork-rails'
  gem 'guard-spork' 
  gem 'childprocess', '0.3.6'
  gem 'factory_girl_rails', '4.2.0'
end

group :test do
  gem 'selenium-webdriver', '2.35.1'
  gem 'capybara'
  gem 'growl', '1.0.3'
end

gem 'sass-rails', '4.0.3'
gem 'uglifier', '2.1.1'
gem 'coffee-rails', '4.0.1'
gem 'jquery-rails', '3.0.4'
gem 'turbolinks', '1.1.1'
gem 'jbuilder', '1.0.2'

group :doc do
  gem 'sdoc', '0.3.20', require: false
end

group :production do
  gem 'rails_12factor', '0.0.2'
end

As for the concerns mentioned in the second link that eliminating --drb in the Guardfile turns off spork:

Before doing $ bundle exec guard:

$ time bundle exec rspec spec/
No DRb server is running. Running in local process instead ...
.........................................

Finished in 1.24 seconds
41 examples, 0 failures

Randomized with seed 20709


real    0m6.186s
user    0m5.082s
sys     0m1.018s

Then starting guard in another terminal window:

$ bundle exec guard

Then doing this again:

$ time bundle exec rspec spec/
.........................................

Finished in 1.66 seconds
41 examples, 0 failures

Randomized with seed 7823


real    0m3.145s
user    0m1.015s
sys     0m0.178s

...you can see there was a speed up.

Community
  • 1
  • 1
7stud
  • 46,922
  • 14
  • 101
  • 127