RailsTutorial - глава 8.4.3 - Тестовая база данных не очищается после добавления пользователя в интеграционном тесте - PullRequest
6 голосов
/ 28 марта 2011

Я в тупике.

Пока все в учебнике прошло гладко, но когда я добавляю этот кусок кода в мой файл /spec/requests/users_spec.rb, все начинаетперейти на юг:

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 => "ryan@example.com"
        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

Если я очищаю тестовую базу данных (rake db: test: prepare), все тесты проходят.Но если я снова запускаю тесты, они терпят неудачу, потому что тестовая база данных не очищает запись, которую добавил код выше.

Я немного погуглил, и большинство из того, что я обнаружил, указывало либо на настройку config.use_transactional_fixtures, либо на проблему с вложенностью в коде.ни один из них не относится ко мне.Вот мой файл spec_helper.rb:

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

, а вот мой 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 => "ryan@example.com"
          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

Есть идеи?Спасибо.

С ответом mpapis я смог заставить это работать.Вот мой обновленный файл спецификации / запросов / user_spec.rb:

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 => "ryan@example.com"
          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

Ответы [ 2 ]

2 голосов
/ 28 марта 2011

Насколько мне известно, тестирование представлений оставляет базу данных в неясном состоянии, вы должны попробовать https://github.com/bmabey/database_cleaner она используется для очистки после тестов на огурец, но пример для Rspec доступен на главной странице.

0 голосов
/ 23 мая 2011

Ответ mpapis заставил его работать.

Не забудьте включить его в свой GEMFILE, например:

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    

и

bundle install
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...