Tag: 数据库清理器

使用RSPEC进行测试时突然出现无法解释的活动记录连接超时

这是我几乎一无所知的地方,所以请提前道歉。 我有一套超过800个rspec测试。 在运行整个集合或仅仅是特定的测试文件时突然而且莫名其妙地,在这些之后(例如20个左右,虽然它们的数字从不完全相同),每个单独的测试都会以相同的错误开始失败: Failure/Error: Unable to find matching line from backtrace ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds) 在典型的运行中,我会在20次左右的请求测试后开始收到这些错误,其余的780+测试都会因上述完全相同的错误而失败。 我已经尝试回到之前测试完美的先前git提交和分支。 没有运气 – 仍有780多个失败。 还完全删除了重新创建的测试数据库。 也没有运气。 我已经阅读了许多关于连接池等的线程,但我恐怕我不知道如何诊断甚至发生了什么。 以下是我现在所知道的事实: 使用Postgresql 据我所知,开发环境运行良好 在一切工作正常和现在之间,我没有对我所知道的环境进行任何更改/升级。 甚至没有任何数据库迁移。 只需更改模型,视图和控制器代码。 正如我所提到的,回到之前的提交并没有解决任何问题。 config.use_transactional_fixtures = false因为我正在通过Selenium测试ajaxfunction。 但是,无论Selenium是否用于特定的测试集,测试都会失败。 即使我只运行不使用Selenium的测试,在20次左右的测试后仍然会出现故障。 我正在使用具有以下配置的Database Cleaner而不是事务夹具: config.before(:suite) do DatabaseCleaner.clean_with(:truncation) end config.before(:each) do DatabaseCleaner.strategy = :transaction […]

MiniTest,Capybara,Fixture,Database_Cleaner第二次不通过

以下测试首次通过(在rake db:test:prepare ),但是失败在后续运行时出错。 Capybara :: ElementNotFound:无法找到css“#sale_payment_btn” require “test_helper” DatabaseCleaner.strategy = :transaction class SaleFeatureTest < Capybara::Rails::TestCase include Warden::Test::Helpers Warden.test_mode! self.use_transactional_fixtures = false setup do login_as users(:admin), scope: :user Capybara.current_driver = :selenium #:webkit DatabaseCleaner.start end teardown do DatabaseCleaner.clean Warden.test_reset! end test "Sale" do visit(new_sale_path) # create new sale and redirect to it assert page.has_css?('#sale_payment_btn') # gave error […]

Rspec极其缓慢

我的rspec测试似乎运行速度非常慢,即使有防护和spork。 Finished in 5.36 seconds 13 examples, 2 failures 我知道我可以做几件事来优化我的测试并减少与数据库的交互,但我强烈怀疑spec_helper设置不正确。 我在轨道3.2.11与mongoid。 每次运行后数据库清理程序都会清理。 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’ require ‘capybara/rspec’ Dir[Rails.root.join(“spec/support/**/*.rb”)].each {|f| require f} DatabaseCleaner[:mongoid].strategy = :truncation RSpec.configure do |config| config.infer_base_class_for_anonymous_controllers = false config.order = “random” config.filter_run focus: true config.filter_run_excluding :remove => true config.run_all_when_everything_filtered […]

是否还需要使用Rails系统规范的DatabaseCleaner?

从我所读到的有关Rails 5.1新系统规范的所有内容中,我的理解是Rails现在在内部处理数据库事务。 来自Rspec的博客 :“[之前]您的测试和您测试的代码无法共享数据库事务,因此您无法使用RSpec的内置机制来回滚数据库更改,而是需要像数据库更清洁的gem。通过系统测试,Rails团队已经做了艰苦的工作以确保不是这种情况,因此您可以安全地使用RSpec的机制,而无需额外的gem。“ 我的经历不同: 升级到Rails 5.1后,我的Rspecfunction测试全部通过。 我将’function’规格重命名为’系统’规格。 所有测试都通过了 我删除了Database Cleaner gem,并删除了rails_helper.rb所有引用。 由于validates uniqueness错误,JS测试现在失败了。 非JS测试通过。 我的测试非常简单。 let(:subject) { page } let(:user) { create :user, name: “TestUser” } it “displays the user page”, :js do visit user_path(user) it is_expected.to have_content “TestUser” end 禁用数据库清除程序并且:js => true我得到user named TestUser already exists 。 使用:js => false ,测试通过。 系统测试和rspec的当前情况如何? Rails是否在内部处理数据库事务,还是仍需要数据库清理程序? […]

Rails minitest,数据库更清洁如何转为use_transactional_fixtures = false

我想在ministest中禁用use_transactional_fixtures = false来捕获after_commit回调。 我应该在什么地方和哪里设置?

RSpec和数据库清理程序 – 将某些对象永久保留在测试数据库中

我(姗姗来迟)开始使用RSpec / capybara测试我的Rails应用程序(购物网站),使用数据库清理程序清除数据库,并使用Factory Girl为每个测试生成新对象(像大多数人一样)。 这很好用,我认为清除测试之间的数据是个好主意。 但是,它可能会变慢并且(据我所知)生成同一对象的多个实例有点乏味。 在我的数据库中有一些对象总是相同的,或者我将始终为测试生成相同的副本。 例如,我的Package模型,它定义订阅包的定价和function限制。 它可能永远不会改变。 有没有办法,使用此配置(请注释并指定是否需要更多信息),将某些对象实例放入测试数据库并将其从数据库清理器中排除 ,或以任何其他方式保留特定对象的永久副本测试数据库? 这主要是为了提高测试速度。

如何在错误的rspec规范之间清理我的数据库?

我已将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 现在,只要运行的每个最后一个规范通过或失败,此配置都可以正常工作。 但是,如果出现错误(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) ),数据库没有清理! 错误之前的规范中的残留数据保留在数据库中。 我想这是因为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 […]

数据库清理程序不在最小的轨道中工作

如果我使用rake minitest:controllers单独运行我的Minitest控制器测试工作正常但是当我运行rake minitest:all然后我得到validation失败错误。 这是因为电子邮件已经用于模型测试。 我使用DatabaseCleaner清理数据库但无法清理数据库。 我的数据库清理代码: require “database_cleaner” DatabaseCleaner.strategy = :transaction class MiniTest::Rails::ActionController::TestCase include Devise::TestHelpers def setup DatabaseCleaner.start end def teardown DatabaseCleaner.clean end