我有两个集成测试,这里看起来如何:
class TagFlowTest < ActionDispatch::IntegrationTest
include Devise::Test::IntegrationHelpers
setup do
sign_in FactoryGirl.create(:admin)
@partner = create(:partner)
end
test 'can see the list of partners' do
get '/partners'
assert_response :success
assert_select 'tr', 2
end
... more tests below ...
第二次测试看起来一样 问题是,当这个测试的发射轨道测试时,它运行正常。但是当我发布时:
rails test / test /
我收到了一个错误:
UnexpectedError:ActiveRecord :: RecordNotUnique:PG :: UniqueViolation: 错误:重复键值违反唯一约束 “index_users_on_email”
我知道问题来自
sign_in FactoryGirl.create(:admin)
当我在另一个测试中删除此行时,它正在工作。 但如果我这样做,我不能只测试一个测试。我该如何解决这个问题?
答案 0 :(得分:3)
UnexpectedError: ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_users_on_email"
那么这个错误意味着什么?您在模型级别或数据库级别进行了一些验证,这些验证不会让您拥有管理员的重复电子邮件。
所以我假设您用来创建Admin的工厂没有创建唯一的电子邮件地址。
试试这个
FactoryGirl.define do
factory :admin do
# your code
email { Faker::Internet.email }
end
end
但这件事需要faker宝石。如果您不想仅仅为此使用宝石,请尝试在工厂女孩中使用序列。
在运行测试时,让数据库处于干净状态也很不错。考虑使用https://github.com/DatabaseCleaner/database_cleaner