레일즈 앱에서 데이터베이스 클리너를 작동시키는 방법에 대한 지침이 필요합니다. 기록의 ID는 각 테스트마다 계속 증가하며 닦아 내지 않습니다.레일즈 + Rspec : 데이터베이스 클리너 젬이 작동하지 않습니다.
나는 데이터베이스 클리너가 작동하고 실패했는지 확인하기위한 테스트를 설정했습니다.
사양/모델/문제/database_cleaner_test.rb
require 'rails_helper'
describe "db_cleaner" do
let!(:article) { FactoryGirl.create(:article) }
it "first test" do
expect(Article.all.count).to eq(1)
expect(Article.last.id).to eq(1)
end
it "should clean db" do
expect(Article.all.count).to eq(1)
expect(Article.last.id).to eq(1)
end
end
실패 :
1) db_cleaner should clean db
Failure/Error: expect(Article.last.id).to eq(1)
expected: 1
got: 2
(compared using ==)
설정 : 여기
gem 'rails', '~> 5.1.2'
gem 'pg', '~> 0.18'
group :development, :test do
gem 'rspec-rails', '~> 3.6', '>= 3.6.1'
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
gem 'capybara', '2.7.1'
gem 'capybara-webkit'
gem 'database_cleaner', '~> 1.6', '>= 1.6.2'
gem 'capybara-screenshot'
gem 'factory_girl_rails', '~> 4.8'
end
내가 내 레일에서 볼 것입니다 테스트 콘솔 nd 유형을
DatabaseCleaner.clean
=> [#<DatabaseCleaner::Base:0x00000005e09368 @orm=:active_record, @strategy=#<DatabaseCleaner::ActiveRecord::Transaction:0x00000005e08f58 @db=:default, @connection_class=ActiveRecord::Base>, @db=:default>]
readme에서 데이터베이스 청소기 권장 구성을 복사하여 붙여 넣었습니다. 작동하지 않습니다.
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'spec_helper'
require 'rspec/rails'
Capybara.javascript_driver = :webkit
Capybara.server = :puma
require 'capybara/rails'
require 'capybara/rspec'
require 'capybara-screenshot/rspec'
require 'capybara/webkit/matchers'
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
Capybara.ignore_hidden_elements = false
ActiveRecord::Migration.maintain_test_schema!
RSpec.configure do |config|
config.fixture_path = "#{::Rails.root}/spec/fixtures"
RSpec.configure do |config|
config.use_transactional_fixtures = false
config.before(:suite) do
if config.use_transactional_fixtures?
raise(<<-MSG)
Delete line `config.use_transactional_fixtures = true` from rails_helper.rb
(or set it to false) to prevent uncommitted transactions being used in
JavaScript-dependent specs.
During testing, the app-under-test that the browser driver connects to
uses a different database connection to the database connection used by
the spec. The app's database connection would not be able to access
uncommitted transaction data setup over the spec's database connection.
MSG
end
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, type: :feature) do
# :rack_test driver's Rack app under test shares database connection
# with the specs, so continue to use transaction strategy for speed.
driver_shares_db_connection_with_specs = Capybara.current_driver == :rack_test
if !driver_shares_db_connection_with_specs
# Driver is probably for an external browser with an app
# under test that does *not* share a database connection with the
# specs, so use truncation strategy.
DatabaseCleaner.strategy = :truncation
end
end
config.before(:each) do
DatabaseCleaner.start
end
config.append_after(:each) do
DatabaseCleaner.clean
end
config.infer_spec_type_from_file_location!
config.filter_rails_from_backtrace!
config.include FactoryGirl::Syntax::Methods
config.include(Capybara::Webkit::RspecMatchers, :type => :feature)
config.include Warden::Test::Helpers
Warden.test_mode!
config.after :each do
Warden.test_reset!
end
end
Capybara::Webkit.configure do |config|
config.block_unknown_urls
end
RSpec::Matchers.define :appear_before do |later_content|
match do |earlier_content|
page.body.index(earlier_content) < page.body.index(later_content)
end
end
나는이 자습서를 참조하고 RSpec에 설정을 쥐게하지만,이 역시 도움이되지 않습니다 않은 : 여기에 내 전체 rails_helper.rb 파일이 (내가 카피 바라의 웹킷과 RSpec을 사용하고 있습니다).
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'database_cleaner'
require 'spec_helper'
require 'rspec/rails'
Capybara.javascript_driver = :webkit
Capybara.server = :puma
require 'capybara/rails'
require 'capybara/rspec'
require 'capybara-screenshot/rspec'
require 'capybara/webkit/matchers'
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
Capybara.ignore_hidden_elements = false
Capybara::Screenshot.autosave_on_failure = false
ActiveRecord::Migration.maintain_test_schema!
RSpec.configure do |config|
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = false
config.infer_spec_type_from_file_location!
config.filter_rails_from_backtrace!
config.include FactoryGirl::Syntax::Methods
config.include(Capybara::Webkit::RspecMatchers, :type => :feature)
config.include Warden::Test::Helpers
Warden.test_mode!
config.after :each do
Warden.test_reset!
end
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, :js => true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
Capybara::Webkit.configure do |config|
config.block_unknown_urls
end
공유 할 수있는 문제가 재현 된 Repo가 있습니까? –
실제로'rspec-rails'가 작동하는 것처럼 보이는 트랜잭션 제어 ('count' 기대가 깨지지 않기 때문에). 순차적 ID 만 재설정되지 않습니다 ... 왜 테스트에 문제가 있습니까? –