ruby-on-rails - 设计测试数据库记录同时测试的冲突

标签 ruby-on-rails devise tdd factory-bot rspec-rails

我从以下工厂生成用户、客户和发票

FactoryGirl.define do
  factory :user do
    sequence(:email) { |n| "person_#{n}@example.com" }
    password "foobar"
    password_confirmation "foobar"
  end

  factory :client do
    sequence(:name) { |n| "Client Name #{n}" }
    sequence(:address1) { |n| "#{n} Street name" }
    sequence(:address2) { |n| "#{n} Area name" }
    city "Chennai"
    state "Tamil Nadu"
    country "India"
    zipcode "600001"
    contactname "Sathish Manohar"
    sequence(:email) { |n| "person_#{n}@example.com"}
    user
  end

  factory :invoice do
    client
  end
end

我有一些请求和型号规范,以下是我的主要请求规范:

https://gist.github.com/4418869 -clients_pages_spec.rb
https://gist.github.com/4418876 -invoices_pages_spec.rb

当在 after(:all) { User.delete_all } 调用中删除所有 user 时,使用 bundle exec 按顺序运行时所有测试都会通过rspec 规范 --默认顺序

如果在 after(:all) { User.delete_all } 中未删除所有用户,则在运行测试时会出现电子邮件唯一性错误。这是设计验证每个用户电子邮件的唯一性时出现的错误,所以我认为在第二次运行测试时,factory_girl尝试创建相同的用户。

这是错误消息:
/home/sathish/.rvm/gems/ruby-1.9.3-p194@invoice_jet/gems/activerecord-3.2.8/lib/active_record/validations.rb:56:in `save!': 验证失败: 电子邮件已经已被占用(ActiveRecord::RecordInvalid)

如何消除此错误消息,并创 build 备用户以正确的方式进行测试?

背景信息:
spec_helper.rb 具有 config.use_transactional_fixtures = true
使用mysql作为数据库所有表都使用InnoDB引擎

最佳答案

我认为您应该定义一个默认策略,用于在每个规范之后完全清理数据库,并通过这样做来保证每个测试的隔离。

看看 https://github.com/bmabey/database_cleaner 上的 Database Cleaner gem .

您所要做的就是将 gem 放入 Gemfile 中,运行 bundle (假设您正在使用 bundler )并定义一个策略,如下所示:

RSpec.configure do |config|

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

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

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

end

希望对你有帮助!

关于ruby-on-rails - 设计测试数据库记录同时测试的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14100646/

相关文章:

ruby-on-rails - Docker:服务器是否在主机 “localhost”(::1)上运行并在端口5432上接受TCP/IP连接?

ruby-on-rails - RSpec 访问 application_controller 方法如 'current_user'

ruby-on-rails - 使用 Devise 进行客户端验证

C#:如何对 GetHashCode 进行单元测试?

javascript - 将部分 View 注入(inject) div 标签

ruby-on-rails - 添加新列后更新脚手架 View

ruby-on-rails - 我如何使用路由别名改进重定向

ruby-on-rails - Rails 4 Devise/Omniauth 电子邮件存在于数据库错误

ruby - 如何测试一个元素是从列表中随机选择的?

python - 我应该如何指示尚未用 Python 编写测试?