Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 带有事务性_fixture的Rspec=true抛出唯一性错误_Ruby On Rails_Testing_Rspec_Factory Bot_Grape Api - Fatal编程技术网

Ruby on rails 带有事务性_fixture的Rspec=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)

我正在测试我的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)
     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