ruby-on-rails - RSpec 在测试数据库中留下记录

标签 ruby-on-rails ruby rspec

每当我运行用户测试时,RSpec 都会在测试完成后将 Fabricated 用户留在测试数据库中,这会扰乱我的其他测试。我将执行 rake db:test:prepare,但是当我再次运行测试时,会在我的数据库中重新创建记录。我不知道为什么会这样。它只发生在用户对象上。

在我的 spec_helper 文件中我什至有:

config.use_transactional_fixtures = true

这是一个创建记录的示例测试:

it "creates a password reset token for the user" do
  alice = Fabricate(:user) 
  post :create, email: alice.email
  expect(assigns(alice.password_reset_token)).to_not eq(nil)
end

制造商:

Fabricator(:user) do
  email { Faker::Internet.email }
  password 'password'
  name { Faker::Name.name }
end

这可能与我的用户模型有关吗?

最佳答案

你应该使用一个名为 database_cleaner 的 gem,它将截断你的数据库并自动重置所有内容,因此在你的 gem 文件中添加 gem database_cleaner,然后在你的 spec_helper.rb 中配置它

spec_helper.rb

config.use_transactional_fixtures = false

config.before(:suite) do
  DatabaseCleaner.strategy = :truncation
end

config.before(:each) do
  DatabaseCleaner.start
end

config.after(:each) do
  DatabaseCleaner.clean
end

然后在您的 spec/support 目录中创建一个新文件

规范/支持/shared_db_connection.rb

class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil

  def self.connection
    @@shared_connection || retrieve_connection
  end
end
ActiveRecord::Base.shared_connection=ActiveRecord::Base.connection

现在,无论何时运行测试,数据库都会被重置。这摘自 Aaron Sumner 的“Everyday Rails testing with RSpec”一书

关于ruby-on-rails - RSpec 在测试数据库中留下记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19209865/

相关文章:

ruby-on-rails - 出现意外 ',' ,期待 => 禁止错误

ruby-on-rails - Nokogiri 使用 Ruby On Rails 进行抓取未按预期工作

ruby - 在 ruby​​ 命令中传递变量?

ruby-on-rails - 是否可以在 Rails 中获取原始参数字符串?

ruby-on-rails - 使用和测试 Rails ActionController 的 respond_with

ruby-on-rails - 使用 FactoryGirl/rspec 避免长外键链

javascript - 模板中的 AngularJS + Bootstrap 工具提示

javascript - Rails 4.2 jQuery 仅在刷新后加载

ruby-on-rails - Sidekiq 是否适用于高度关键任务、需要一次性执行保证、需要单线程执行的任务?

ruby-on-rails - RSolr::Error::Http: RSolr::Error::Http - 500 内部服务器错误