我从以下工厂生成用户、客户和发票
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/