Ruby on rails 带有事务性_fixture的Rspec=true抛出唯一性错误
我正在测试我的API,使用Grape和Rails构建,使用RSpec构建,并得到许多唯一性验证错误 我使用config.use\u transactional\u fixtures=true在每次测试后回滚数据库,但我发现以下错误:Ruby on rails 带有事务性_fixture的Rspec=true抛出唯一性错误,ruby-on-rails,testing,rspec,factory-bot,grape-api,Ruby On Rails,Testing,Rspec,Factory Bot,Grape Api,我正在测试我的API,使用Grape和Rails构建,使用RSpec构建,并得到许多唯一性验证错误 我使用config.use\u transactional\u fixtures=true在每次测试后回滚数据库,但我发现以下错误: 7) API GET /api/v1/quotations returns 200 when there is at least one quotation Failure/Error: FactoryGirl.create(:quotation)
7) API GET /api/v1/quotations returns 200 when there is at least one quotation
Failure/Error: FactoryGirl.create(:quotation)
ActiveRecord::RecordInvalid:
Validation failed: Number has already been taken
# ./spec/requests/api/quotations_spec.rb:56:in `block (3 levels) in <top (required)>'
联系工厂
报价工厂
请求工厂
我的部分报价单\u spec.rb
更新1
我切换到DatabaseCleaner并尝试调试:
config.after(:each) do
puts
puts '####'
puts Client.all
puts '####'
puts Contact.all
puts '####'
puts
DatabaseCleaner.clean
puts
puts '####'
puts Client.all
puts '####'
puts Contact.all
puts '####'
puts
# Reset tentant back to `public`
Apartment::Database.reset
end
实际上,数据库已被清理,因此Contact.all和Client.all在database.clean之后为空。这很让人困惑,因为否则验证错误就不会发生了。我找到了答案。多亏了这个答案: 我必须用如下序列替换唯一字段:
FactoryGirl.define do
factory :user do
name Faker::Name.name
surname Faker::Name.last_name
sequence :email do |n|
"foo#{n}@bar.de"
end
password 'secret'
password_confirmation 'secret'
end
end
FactoryGirl.define do
factory :quotation do
number Faker::Number.number(8)
title Faker::Lorem.word
payable Faker::Lorem.sentence
request
contact
end
end
FactoryGirl.define do
factory :request do
number Faker::Number.number(8)
title Faker::Lorem.word
content Faker::Lorem.sentence
contact
end
end
require 'spec_helper'
describe API do
include Rack::Test::Methods
def app
API
end
####################################################################################################################
# Authentication
####################################################################################################################
let(:url) { 'http://testing.domain.com' }
let!(:access_token) do
user = FactoryGirl.create(:user)
api_key = FactoryGirl.create(:api_key_session, foreign_id: user.id)
api_key.access_token
end
describe 'GET /api/v1/quotations' do
it 'returns 401 when unauthorized' do
get "#{url}/api/v1/quotations"
expect(last_response.status).to eq 401
end
end
####################################################################################################################
# GET quotations
####################################################################################################################
describe 'GET /api/v1/quotations' do
#----------------------------------------------------------------------------------------------------------------#
it 'returns 404 when quotations not found' do
header 'X-Access-Key', access_token
get "#{url}/api/v1/quotations"
expect(last_response.status).to eq 404
end
#----------------------------------------------------------------------------------------------------------------#
it 'returns 200 when there is at least one quotation' do
FactoryGirl.create(:quotation)
header 'X-Access-Key', access_token
get "#{url}/api/v1/quotations"
expect(last_response.status).to eq 200
end
#----------------------------------------------------------------------------------------------------------------#
end
end
config.after(:each) do
puts
puts '####'
puts Client.all
puts '####'
puts Contact.all
puts '####'
puts
DatabaseCleaner.clean
puts
puts '####'
puts Client.all
puts '####'
puts Contact.all
puts '####'
puts
# Reset tentant back to `public`
Apartment::Database.reset
end
FactoryGirl.define do
factory :user do
name Faker::Name.name
surname Faker::Name.last_name
sequence :email do |n|
"foo#{n}@bar.de"
end
password 'secret'
password_confirmation 'secret'
end
end