Reputation: 203
HI i am trying to test a form by filling some data through capybara . My test runs without any error but i can not see that data either in test or development databases. My test is in "spec/feature/FILE NAME". My test is something like
require 'spec_helper'
feature "New Application" do
scenario 'has 200 status code if logged in' do
visit '/applications/new?id=.........'
fill_in 'application[applicants_attributes][0][first_name]', :with => 'Rose'
fill_in 'application[applicants_attributes][0][first_name]', :with => 'Farmer'
click_link 'sbmt'
current_path.should == '/applications/new'
page.status_code.should be 200
end
end
Need Help please!!!! My spec_helper is something like
require 'simplecov'
SimpleCov.start do
add_filter '/spec/'
add_filter '/config/'
add_filter '/lib/'
add_filter '/vendor/'
end
# 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'
# Add this to load Capybara integration:
require 'capybara/rspec'
require 'capybara/rails'
require 'rspec/autorun'
require 'crack'
Capybara.register_driver :rack_test do |app|
Capybara::RackTest::Driver.new(app, :headers => { 'User-Agent' => 'Capybara' })
end
# 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 }
RSpec.configure do |config|
config.include Capybara::DSL, type: :feature
RSpec.configure do |config|
config.use_transactional_fixtures = false
#config.use_transactional_fixtures = false
config.before :each do
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.start
end
config.after do
DatabaseCleaner.clean
end
end
# 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
# 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.
# 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
My rspec output is
Failures:
1) New Application has 200 status code if logged in
Failure/Error: Application.where("first_name = 'Rose' AND last_name = 'Farmer'").count.should == 1
expected: 1
got: 0 (using ==)
# ./spec/features/applications_controller_spec.rb:23:in `block (2 levels) in <top (required)>'
Finished in 0.7381 seconds
1 example, 1 failure
Failed examples:
rspec ./spec/features/applications_controller_spec.rb:4 # New Application has 200 status code if logged in
Randomized with seed 49732
Coverage report generated for Cucumber Features to /home/nomi/homesbyhaven/coverage. 241 / 616 LOC (39.12%) covered.
Problem is i am not able to save the data to database . if i remove the check for the data in Application table from the test. it passes. but how can i verify that it is really passing. i mean to say there is no issues.
Thanks
Upvotes: 0
Views: 977
Reputation: 47578
I think the issue here is that you are testing the wrong thing. A feature (integration) spec tests the system the way a user interacts with it. So as much as possible, your test should limit itself to the activities a user can perform. Instead of checking that, for example, after adding a user the User.count
goes up by one, have the test do the same thing a user would do to verify that the the action was successful. You could visit the user page to see that the user was added, or have an element on the page that tells you how many users exist.
Remember that the test server and the browser use separate processes. This can cause timing issues where you expect that the server has completed an action (eg. adding a user) in one process, but the database change is occurring in another process. You can avoid those issues by having the test browser imitate a user's actions. Do the database testing in model specs.
Upvotes: 1
Reputation: 29369
You will have a block like below in your spec/spec_helper.rb . I do not recommend disabling the transactional fixture as it will cause lot of problems when you have more than one test.
RSpec.configure do |config|
# Mock Framework
config.mock_with :rspec
# 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
# Render views when testing controllers
# This gives us some coverages of views
# even when we aren't testing them in isolation
config.render_views
end
Instead what you can do is, make the database check as an assertion in your test case
require 'spec_helper'
feature "New Application" do
scenario 'has 200 status code if logged in' do
visit '/applications/new?id=.........'
fill_in 'application[applicants_attributes][0][first_name]', :with => 'Rose'
fill_in 'application[applicants_attributes][0][last_name]', :with => 'Farmer'
click_link 'sbmt'
current_path.should == '/applications/new'
Application.where("first_name = 'Rose' AND last_name = 'Farmer'").count.should == 1
page.status_code.should be 200
end
end
If the above test fails, then your functionality is not working as expected
You cannot use transactional fixtures if you are using anything other than ActiveRecord. If you are using MongoID you can use Database Cleaner with Truncation Strategy
RSpec.configure do |config|
config.use_transactional_fixtures = false
config.before :each do
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.start
end
config.after do
DatabaseCleaner.clean
end
end
Upvotes: 0
Reputation: 1177
By default the test database is cleared after each test. So that each time you run the tests, you've got a clean slate.
If you don't want this to happen you can change the config in you spec/spec_helper.rb to
config.use_transactional_fixtures = false
but if you not clearing the db after each test, then any records created from the previously run test could change the result of the next test. Giving you a false positive or negative
Upvotes: 0