I'm really liking capybara and rpsec and I can write some great integration tests with them. However, I am slightly confused by something. I may be wrong here, but it seems, once I've installed capybara, and I have my specs in spec/features, capybara methods such as visit are available to the specs inside spec/features (e.g. spec/features/controllers/statuses_spec.rb), but rspec methods such as route_to are now unavailable to these specs!
What does this mean? Does capybara provide methods that make up for my now unavailable rspec methods? E.g, visit, rather than get?
This doesn't seem very intuitive. Hopefully I'm doing something wrong regarding my setup:
Gemfile:
source 'https://rubygems.org'
group :development do
gem 'capistrano'
gem 'guard-rspec'
gem 'rb-fsevent'
gem 'debugger'
end
group :development, :test do
gem 'rspec-rails', '~> 2.14.0'
gem 'sqlite3'
end
group :test do
gem 'factory_girl_rails'
gem 'capybara', '~> 2.2.0'
# gem "capybara-webkit"
gem 'launchy'
gem 'database_cleaner'
end
group :production do
gem 'pg'
end
gem 'rails', '4.0.1'
gem 'sass-rails', '~> 4.0.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 1.2'
group :doc do
gem 'sdoc', require: false
end
gem 'devise'
# Use puma as the app server
# gem 'puma'
spec/spec_helper.rb
# 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'
require 'capybara/rspec'
# 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
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
Capybara.run_server = true
Capybara.javascript_driver = :webkit
Capybara.default_selector = :css
Capybara.server_port = 7171
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.include RSpec::Rails::RequestExampleGroup, type: :feature
# 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"
end
spec/features/controllers/statuses_spec.rb
require 'spec_helper'
describe StatusesController do
describe "routing" do
# contains only capybara methods and so it passes
it "contains welcome message" do
visit("/statuses")
page.should have_content("All of our statuses ")
end
# contains rspec methods and so I recieve a no method failure
it "responds with 200" do
get("/statuses").should respond_with 200
end
end
end
Output:
13:17:44 - INFO - Running: spec/features/controllers/statuses_spec.rb
.F
Failures:
1) StatusesController routing responds with 200
Failure/Error: get("/statuses").should respond_with 200
NoMethodError:
undefined method `respond_with' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x00000101787560>
# ./spec/features/controllers/statuses_spec.rb:12:in `block (3 levels) in <top (required)>'
Finished in 0.40626 seconds
2 examples, 1 failure
I bet it's something to do with placing these specs in a 'features' directory, but I need to place them in a 'features' directory to utilize capybara methods.
So I need to place all specs that use capybara methods in 'features' and all that use rspec methods in 'spec'? Hope not. How should I setup my files?
specs/featuresfolder, you should only usevisitwith paths, fill forms and click etc... inspecs/controllerusegetor any http verb to be sure your controller behaves as you desire - apneadiving