RailsTutorial - chapter 8.4.3 - Test database not clearing after adding user in integration test
Asked Answered
G

2

6

I'm stumped on this one.

Everything on the tutorial has gone smoothly so far, but when I add this chunk of code to my /spec/requests/users_spec.rb file, things start to go south:

describe "success" do

  it "should make a new user" do
    lambda do
      visit signup_path
        fill_in "Name",         :with => "Example User"
        fill_in "Email",        :with => "[email protected]"
        fill_in "Password",     :with => "foobar"
        fill_in "Confirmation", :with => "foobar"
        click_button
        response.should have_selector("div.flash.success",
                                      :content => "Welcome")
        response.should render_template('users/show')
        end.should change(User, :count).by(1)
      end
    end

If i clear the test database ( rake db:test:prepare ), all of the tests pass. But if i run the tests again, they fail because the test database doesn't clear the record that the code above added.

I've googled quite a bit, and most of what i found pointed either to the config.use_transactional_fixtures setting, or to a nesting issue in the code.

I'm pretty sure that neither of these is the case for me. Here is my 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'

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

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

    # Needed for Spork
    ActiveSupport::Dependencies.clear
  end 

end

Spork.each_run do
  load "#{Rails.root}/config/routes.rb"
  Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f } 
end

and here is my users_spec.rb:

describe "Users" do

  describe "signup" do

    describe "failure" do

      it "should not make a new user" do
        lambda do
          visit signup_path
          fill_in "Name",         :with => ""
          fill_in "Email",        :with => ""
          fill_in "Password",     :with => ""
          fill_in "Confirmation", :with => ""
          click_button
          response.should render_template('users/new')
          response.should have_selector("div#error_explanation")
        end.should_not change(User, :count)
      end 
    end 


    describe "success" do

      it "should make a new user" do
        lambda do
          visit signup_path
          fill_in "Name",         :with => "Example User"
          fill_in "Email",        :with => "[email protected]"
          fill_in "Password",     :with => "foobar"
          fill_in "Confirmation", :with => "foobar"
          click_button
          response.should have_selector("div.flash.success",
                                        :content => "Welcome")
          response.should render_template('users/show')
        end.should change(User, :count).by(1)
      end 
    end 
  end 
end

Any ideas? Thanks.

With mpapis answer, i was able to get this working. Here is my updated spec/requests/user_spec.rb file:

require 'spec_helper'
require 'database_cleaner'
DatabaseCleaner.strategy = :truncation

describe "Users" do

  describe "signup" do

    describe "failure" do

      it "should not make a new user" do
        lambda do
          visit signup_path
          fill_in "Name",         :with => ""
          fill_in "Email",        :with => ""
          fill_in "Password",     :with => ""
          fill_in "Confirmation", :with => ""
          click_button
          response.should render_template('users/new')
          response.should have_selector("div#error_explanation")
        end.should_not change(User, :count)
      end 
    end 


    describe "success" do

      it "should make a new user" do
        lambda do
          visit signup_path
          fill_in "Name",         :with => "Example User"
          fill_in "Email",        :with => "[email protected]"
          fill_in "Password",     :with => "foobar"
          fill_in "Confirmation", :with => "foobar"
          click_button
          response.should have_selector("div.flash.success",
                                        :content => "Welcome")
          response.should render_template('users/show')
        end.should change(User, :count).by(1)
        DatabaseCleaner.clean
      end 
    end 
  end 
end
Gantlet answered 28/3, 2011 at 3:31 Comment(2)
You said you added the code to your spec_helper file? It should be in a specific spec, not spec_helper. Was that a typo?Collision
@Collision yeah typo, i edited it. thanks for noticing that.Gantlet
U
2

As far as I'm concerned testing views leaves database in unclear state, you should try https://github.com/bmabey/database_cleaner it is used for cleaning after cucumber tests, but an example for Rspec is available on the main page.

Unger answered 28/3, 2011 at 8:3 Comment(1)
thanks for your help, i will give this a shot when i get home, let you know how it worked.Gantlet
R
-1

mpapis' answer got it to work.

Be sure to include it in your GEMFILE for example:

group :test do
    gem 'rspec', '2.5.0'
    gem 'webrat', '0.7.1'
    gem 'spork', '0.9.0.rc4'
    gem 'factory_girl_rails'
    gem 'database_cleaner'
end    

and

bundle install
Rowboat answered 23/5, 2011 at 9:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.