相关疑难解决方法(0)

如何在错误的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
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)

rspec ruby-on-rails guard database-cleaner factory-bot

6
推荐指数
1
解决办法
6587
查看次数