我看到这个很酷的方法只使用数据库清理程序:使用以下方法截断capybara测试:js => true
在spec_helper.rb中:
config.before(:each) do
DatabaseCleaner.strategy = if example.metadata[:js]
:truncation
else
:transaction
end
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
Run Code Online (Sandbox Code Playgroud)
问题是,使用水豚进行的任何功能测试似乎都需要清除策略:截断.
但是,所有其他规格都适用于:交易,这要快得多.
有没有一种方法只为capybara功能测试指定策略?就像是:
DataCleaner.strategy( :truncation ) if :type => :feature
Run Code Online (Sandbox Code Playgroud) 我已将database_cleaner gem添加到我的rails应用程序中,以便在规范之间清理我的数据库.这是我对database_cleaner的当前配置,位于spec/spec_helper.rb:
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
DatabaseCleaner.start
DatabaseCleaner.clean
end
config.before(:each) do
DatabaseCleaner.clean
end
config.after(:each) do
DatabaseCleaner.clean
end
config.after(:suite) do
DatabaseCleaner.clean
end
Run Code Online (Sandbox Code Playgroud)
现在,只要运行的每个最后一个规范通过或失败,此配置都可以正常工作.
但是,如果出现错误(rspec不会给你一个E像minitest一样的好东西,它会抛出这样的东西:
09:17:32 - INFO - Running: spec
/usr/local/rvm/rubies/ruby-1.9.3-p392/lib/ruby/gems/1.9.1/gems/activerecord-4.0.1/lib/active_record/validations.rb:57:in `save!': Validation failed: Email has already been taken (ActiveRecord::RecordInvalid)
Run Code Online (Sandbox Code Playgroud)
),数据库没有清理!错误之前的规范中的残留数据保留在数据库中.我想这是因为database_cleaner不会将错误的规范视为完成,因此不会清理数据库.
现在,在您再次运行规范之前,这并不会造成任何伤害.然后残差数据会产生类似于此的错误:
09:17:32 - INFO - Running: spec
/usr/local/rvm/rubies/ruby-1.9.3-p392/lib/ruby/gems/1.9.1/gems/activerecord-4.0.1/lib/active_record/validations.rb:57:in `save!': Validation failed: Email has already been taken (ActiveRecord::RecordInvalid)
Run Code Online (Sandbox Code Playgroud)
绕过这个错误很简单; 运行rails_env=test rake db:reset或发射了你的数据库外壳和排空使用SQL语句中的相关表格将清除该数据,并允许顺利要运行的规范.
然而,这变得很烦人.在我的任何规格中都有一个错误的角色(任何让它变得错误而不是失败的东西)会导致我的整个测试工作流程堵塞,就像自动武器的发射机制一样!
您对database_cleaner有什么建议?您是否有任何允许清理数据库的示例配置,即使在错误测试的情况下?
我正在使用后卫来运行我的工厂女孩进一步增强的rspecs:
的Gemfile:
source 'https://rubygems.org'
group :development do
gem 'capistrano' …Run Code Online (Sandbox Code Playgroud) 我怎样才能每次清理数据库呢?
在Rails中,我使用https://github.com/bmabey/database_cleaner,但是我没有找到与node.js类似的东西
node.js(v0.10.26),PostgreSQL(9.3.3),mocha,restify和knex。
我已经database-cleaner为我的 rails 4 应用程序进行了配置,每次运行测试时,我发现我的数据库在test和development环境中都被清除了。
我的配置rails_helper如下:
ENV["RAILS_ENV"] ||= 'test'
# This file is copied to spec/ when you run 'rails generate rspec:install'
require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'database_cleaner'
Rails.env = "test"
# Add additional requires below this line. Rails is not loaded until this point!
# Requires supporting ruby files with custom matchers and macros, etc, in
# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
# run as spec …Run Code Online (Sandbox Code Playgroud) 我正在使用数据库清理器与续集和sqlite外键约束遇到问题.具体来说,我正在使用:truncationCapybara集成测试的策略.
对于给定的示例模式:
CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE events(id INTEGER PRIMARY KEY, title TEXT);
CREATE TABLE events_users(
user_id INTEGER,
event_id INTEGER,
FOREIGN KEY(user_id) REFERENCES users(id),
FOREIGN KEY(event_id) REFERENCES events(id)
);
Run Code Online (Sandbox Code Playgroud)
和续集模特:
class User < Sequel::Model
many_to_many :events
end
class Event < Sequel::Model
many_to_many :users
end
Run Code Online (Sandbox Code Playgroud)
运行以下内容:
# normally this would be run in
# an rspec before(:each) for my :feature specs
DatabaseCleaner.start
DatabaseCleaner.strategy = :truncation
bob = User.create(name: "bob")
sally …Run Code Online (Sandbox Code Playgroud) 我已将我的rails项目的版本从4.2升级到5.2.1我的一些测试失败,因为完整跟踪上的pg连接关闭错误如下所示.
Failure/Error: DatabaseCleaner[:active_record].clean_with(:truncation)
ActiveRecord::StatementInvalid:
PG::ConnectionBad: connection is closed: TRUNCATE TABLE "public"."alerts", "public"."article_attachments", "public"."article_check_specification_tolerances", "public"."article_machine_part_settings", "public"."articles", "public"."attachments", "public"."check_batches", "public"."check_groups", "public"."check_specification_machine_types", "public"."check_specification_priorities", "public"."check_specification_responsibility_areas", "public"."check_specifications", "public"."checks", "public"."comments", "public"."counters", "public"."customers", "public"."defect_groups", "public"."defect_translations", "public"."defects", "public"."delayed_jobs", "public"."furnaces", "public"."gv_area_equipments", "public"."gv_areas", "public"."gv_components", "public"."gv_entries", "public"."gv_equipment_families", "public"."gv_equipments", "public"."gv_squads", "public"."gv_stop_reasons", "public"."gv_sub_equipment_components", "public"."gv_sub_equipments", "public"."job_specifications", "public"."jobs", "public"."lab_recipe_versions", "public"."lab_recipes", "public"."lines", "public"."machine_downtimes", "public"."machine_groups", "public"."machine_part_change_reasons", "public"."machine_part_changes", "public"."machine_part_translations", "public"."machine_parts", "public"."machine_type_group_machine_types", "public"."machine_type_groups", "public"."machine_types", "public"."messages", "public"."mold_sets", "public"."packing_schemes", "public"."rails_admin_settings", "public"."reasons", "public"."rejects", "public"."responsibility_areas", "public"."roles", "public"."settings", "public"."shift_definitions", "public"."shifts", "public"."system_log_entries", "public"."task_status_changes", "public"."tasks", "public"."tresholds", "public"."user_responsibility_areas", "public"."users", "public"."users_roles", "public"."workstations", "public"."machines", "public"."systematic_rejects", "public"."systematic_reject_machines" RESTART IDENTITY CASCADE; …Run Code Online (Sandbox Code Playgroud) 我们有一个使用分片数据库的 AR-Octopus gem 的项目。我们遇到的问题是 gem 'database_cleaner' 在使用这个设置时没有清理记录,因为我们一直在我们的测试数据库中有剩余的记录,这会导致我们的测试套件出现问题。
我找到了这个 GitHub 要点 - https://gist.github.com/nowlinuxing/22ea0ab673a5622eb48d
这是我的 database_cleaner 配置文件
# spec/support/database_cleaner.rb
require 'database_cleaner'
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
["master", *Octopus.config[Rails.env].keys].each do |shard|
DatabaseCleaner[:active_record, model: ActiveRecord::Base.using(shard)]
end
config.around(:each) do |example|
DatabaseCleaner.cleaning do
example.run
end
end
end
Run Code Online (Sandbox Code Playgroud)
有没有人遇到过这个问题?如果是这样,你做了什么来解决这个问题?只是在寻找一些有用的见解。
我正在使用Turnip和Ruby on Rails.我有使用和不使用javascript的场景.我想对transaction非JavaScript场景使用DatabaseCleaner策略,以及truncation标记为等的场景的策略等.@javascript@selenium
我正在使用以下Rspec功能解决方案
config.around(:each, :js => true) do |ex|
DatabaseCleaner.strategy = :truncation
ex.run
DatabaseCleaner.strategy = :transaction
end
Run Code Online (Sandbox Code Playgroud)
但它在Turnip案例中不起作用.使它按预期工作的最佳方法是什么?或者换句话说,如何指定由@javascript(或@selenium等)标记标记的萝卜场景config.before?
我正在尝试使用rspec与mongoid,devise,database_cleaner,我有这个错误
Failure/Error: Unable to find matching line from backtrace
ActiveRecord::ConnectionNotEstablished:
ActiveRecord::ConnectionNotEstablished
# /home/adham/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/connection_adapters/abstract/connection_pool.rb:541:in `retrieve_connection'
# /home/adham/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/connection_handling.rb:113:in `retrieve_connection'
# /home/adham/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/connection_handling.rb:87:in `connection'
# /home/adham/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/fixtures.rb:499:in `create_fixtures'
# /home/adham/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/fixtures.rb:984:in `load_fixtures'
# /home/adham/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/fixtures.rb:957:in `setup_fixtures'
# /home/adham/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/fixtures.rb:806:in `before_setup'
Run Code Online (Sandbox Code Playgroud)
我的gemfile是测试组
group :development, :test do
gem "factory_girl_rails", "~> 4.0"
gem 'rspec-rails', '~> 3.1.0'
gem 'spork', '~> 0.8.5'
gem 'mongoid-rspec', '~> 2.0.0.rc1'
gem 'capybara'
gem 'database_cleaner'
gem 'shoulda-matchers'
end
Run Code Online (Sandbox Code Playgroud)
和我的rails_helper.rb ==
ENV["RAILS_ENV"] ||= 'test'
require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require "mongoid"
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| …Run Code Online (Sandbox Code Playgroud) 我有一个功能规格与Capybara的登录页面,我正在使用FactoryGirl + DatabaseCleaner
require 'rails_helper'
feature 'Admin signs in' do
background do
FactoryGirl.create(:user)
end
scenario 'with valid credentials' do
visit admin_root_path
fill_in 'user_email', :with => 'email@email.com'
fill_in 'user_password', :with => 'testpassword'
click_button 'Sign in'
expect(page).to have_content('Dashboard')
end
scenario 'with invalid credentials' do
visit admin_root_path
fill_in 'user_email', :with => 'email@email.com'
fill_in 'user_password', :with => 'wrongpassword'
click_button 'Sign in'
expect(page).to have_content('Admin Login')
end
end
Run Code Online (Sandbox Code Playgroud)
运行测试,我收到以下错误:
1) Admin signs in test with invalid credentials
Failure/Error: FactoryGirl.create(:user)
ActiveRecord::RecordInvalid:
Validation failed: Email has already been …Run Code Online (Sandbox Code Playgroud) database-cleaner ×10
rspec ×6
capybara ×3
factory-bot ×2
devise ×1
guard ×1
javascript ×1
knex.js ×1
mongoid ×1
node.js ×1
npm ×1
octopus ×1
postgresql ×1
rake ×1
ruby ×1
sequel ×1
sqlite ×1
testing ×1