RSpec не удаляет запись базы данных, поэтому при втором запуске происходит сбой

#ruby-on-rails #rspec

#ruby-on-rails #rspec

Вопрос:

Это из книги Майкла Хартла, раздел 8.4. RSpec тестирует успешную регистрацию, но не удается, потому что адрес электронной почты не уникален. Итак, если я вхожу в код и обновляю адрес электронной почты в спецификации, это работает при первом запуске, но не во второй раз. Я подтвердил это, потому что я могу выполнить тест, изменив адрес электронной почты или иным образом запустив rake db: test: clone.

Любые мысли о том, как преодолеть это, были бы оценены.

Код: требуется ‘spec_helper’

 describe "Users" do
  describe "signup" do
    describe "failure" do
      it "should not make a new user" do
        lambda do
          visit signup_path
          fill_in :user_name,               :with => "" #you can use CSS id instead of label, which is probably better
          fill_in "Email",                  :with => ""
          fill_in "Password",               :with => ""
          fill_in "Password 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 => "alex@example.com"
          fill_in "Password",               :with => "foobar"
          fill_in "Password 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
  

Ответ №1:

Как выглядит ваш файл spec / spec_helper.rb? У вас включены транзакции?

 RSpec.configure do |config|
  config.use_transactional_fixtures = true
end
  

Это запускает каждую из ваших спецификаций в транзакции базы данных, возвращая ее в исходное состояние после каждого тестового запуска.

Как только ваш помощник по спецификации будет выглядеть примерно так, запустите:

 rake db:test:prepare
  

И попробуйте еще раз. Если это не сработает, можете ли вы предоставить дополнительную информацию? Какая версия RSpec? Какая версия Rails?

Комментарии:

1. Спасибо. Я использую Rails 3.0.1 и RSpec 2.5.1. Я на самом деле только что проверил, и мои тесты везде дают сбой. Я проверил spec_helper.rb, и для этого флага уже установлено значение true: ‘config.use_transactional_fixtures = true’

2. Сбой… Я только что запустил rake db: test: prepare, и теперь все работает гладко. Спасибо!

3. Комментарии @Alex были очень полезны. У меня была такая же ошибка с config.use_transactional_fixtures = true, и то же изменение исправило ее.