Нет очистки базы данных или пустой базы данных
Я не могу заставить мой тестовый набор работать. Я пытался смешивать и сочетать разные конфигурации. Но результаты для этого представления одинаковы: либо между тестами ничего не очищается, либо база данных пуста.
Я получаю такие ошибки:
Когда ничего не убрано
1) Authentication Sign in page as new user with valid information creates a user
Failure/Error: select group.name, from: 'user_group_id'
Capybara::Ambiguous:
Ambiguous match, found 2 elements matching option "Group g"
или это пустая БД:
1) Authentication Sign in page as new user with valid information creates a user
Failure/Error: select group.name, from: 'user_group_id'
Capybara::ElementNotFound:
Unable to find option "Group g"
Я пробовал с и без database_cleaner. Я пробовал без Spork. Я пробовал разные конфигурации из разных источников, например:
https://github.com/bmabey/database_cleaner
Но я не могу понять, как заставить это работать.
Вот Gemfile с версиями Gems:
gem 'rails', '3.2.13'
gem 'sqlite3'
group :development, :test do
gem 'libnotify'
gem 'rb-inotify'
gem 'rspec-rails' (2.13.0)
gem 'guard-rspec' (2.5.1)
gem 'guard-spork' (1.5.0)
gem 'guard-livereload'
gem 'rack-livereload'
end
group :test do
gem 'capybara' (2.0.2)
gem 'launchy'
gem 'database_cleaner' (0.9.1)
gem 'factory_girl_rails'
end
Вот мнение:
<%= form_for(@user, url: sessions_path ) do |f| %>
<div class="field">
<%= f.label :group_id %><br />
<%= f.collection_select :group_id, Group.order('name asc').all, :id, :name, :prompt => "Choose your Group" %>
</div>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :phone %><br />
<%= f.text_field :phone %>
</div>
<div class="actions">
<%= f.submit 'Go !'%>
</div>
<% end %>
Две модели:
class Group < ActiveRecord::Base
has_many :users
attr_accessible :name, :phone, :active
end
class User < ActiveRecord::Base
belongs_to :group
attr_accessible :name, :phone, :group_id
validates_presence_of :name, :phone, :group
end
И соответствующие спецификации
require 'spec_helper'
describe "Authentication" do
subject { page }
before { visit root_path }
describe "Sign in page" do
let(:submit) {'Go !'}
let(:session_new_content) { "Who's nearby"}
let(:session_show_content){ "session show"}
describe "as new user" do
describe "with valid information" do
group = Group.create(name: "Group g")
before do
select group.name, from: 'user_group_id'
fill_in 'Name', with: 'Samy'
fill_in 'Phone', with: '0642604568'
end
it "creates a user" do
expect{ click_button submit }.to change(User, :count).by(1)
end
describe "after saving the user" do
let(:user) { User.find_by_phone '0643614864'}
before do
click_button submit
end
it { should have_content session_show_content}
it { should have_content user.name}
end
end
end
end
end
Вот мой spec_helper.rb
require 'rubygems'
require 'spork'
Spork.prefork do
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|
config.use_transactional_fixtures = false
config.infer_base_class_for_anonymous_controllers = false
config.order = "random"
config.include Rails.application.routes.url_helpers
config.include Capybara::DSL
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
end
Spork.each_run do
FactoryGirl.reload
end
Это какие-нибудь предложения?
1 ответ
Проблема, кажется, здесь:
describe "as new user" do
describe "with valid information" do
group = Group.create(name: "Group g")
before do
Вы создаете группу вне блока before, поэтому она создается при загрузке файла (вне транзакции).
Для того, чтобы все было счастливым, нужно переместить group = Group.create(name: "Group g")
звоните либо внутри before
блок или внутри it
блок.
Редактировать: или использовать помощник let, такой какlet(:group) { Group.create(name: "Group g") }