gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:17:09 26 4
gpt4 key购买 nike

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

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

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

当所有 usersafter(: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!': Validation failed: Email has already been taken (ActiveRecord::RecordInvalid)

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

背景资料: spec_helper.rbconfig.use_transactional_fixtures = true使用 mysql 作为数据库,所有表都使用 InnoDB引擎

最佳答案

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

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

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com