Ruby on rails 设计测试数据库记录同步测试中的冲突

Ruby on rails 设计测试数据库记录同步测试中的冲突,ruby-on-rails,devise,tdd,factory-bot,rspec-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}" } s

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

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
我有一些要求和型号规格,以下是我的主要要求规格:

-客户端\u页面\u规范rb
-发票\u页码\u规格rb

当(:all){User.delete_all}调用之后的
中删除所有
用户时,当使用
bundle exec rspec spec--order default按顺序运行时,所有测试都通过

如果(:all){User.delete_all}
之后的
中未删除所有
用户
,则在运行测试时会显示电子邮件唯一性错误。这是Desive验证每个用户电子邮件唯一性的错误,因此我认为在第二次运行测试时,
factory\u 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)

我如何消除这些错误消息,并创建Desive用户,以便以正确的方式进行测试

背景信息:
spec\u helper.rb
具有
config.use\u transactional\u fixtures=true


使用mysql作为数据库所有表都使用InnoDB
引擎

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

请看一下gem上的数据库清理器

您所要做的就是将gem放入您的gem文件中,运行
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

希望有帮助

我同意,测试肯定应该被隔离,但根据我的经验,最好在每次测试之前清理数据库,而不是在测试之后。这样,当出现故障时,您可以查看数据库,然后查看有问题的数据。由于数据库只是数据的存储机制,我不太同意您的说法。。。您的对象模型就是您的应用程序,而您的数据库只是为您提供了一种通过持久化这些对象来保持其状态的方法。无论如何,希望DB Cleaner Gem能帮助您解决所描述的问题我不是问这个问题的人。我同意数据库只是数据的存储,但代码中的数据库层也可能是bug的来源,查看实际存储的数据可能很有用。因此,我认为在每次测试之前清理数据库是一种做法,而不是在测试之后。与每次测试后的清洁相比,您看到了哪些缺点?对不起,没有注意到。。。我一点也不觉得有什么缺点,我只是在争论原因。谢谢!你的回答和这篇文章一起,()帮助我解决了这个问题。似乎我还需要设置
config.use\u transactional\u fixtures=false