0

良い一日。このエラーが発生します

1) Subscription 
     Failure/Error: @subscription = FactoryGirl.create(:subscription)
     ActiveRecord::RecordInvalid:
       Encountered errors: Email already exists, Login already exists

FactoryGirlでは、これらのフィールドの一意性を指定していますが^

ファクトリーガールを呼ぶ

@subscription = FactoryGirl.create(:subscription)

ビルドを実装できません。

validate_uniqueness_of(:category_id).scoped_to(:user_id)

工場:

factory :subscription do
    association :category, factory: :advt_category 
    user
  end
factory :user do
    sequence(:login) { |n| "user__#{n}"  } 
    password "password"
    sequence(:email) { |n| "example__#{n}@example.com"}  
end

このエラーを解決する方法は?なぜそれが現れるのですか?

アップデート

この仕様のユーザーモデルのすべてのレコードを破棄することになりました

before do
User.destroy_all
end
4

2 に答える 2

4

最も可能性の高い問題は、スペックを開始したときにテストDBがクリーンでないことです。これは、rspecが途中で終了するか、強制終了された場合に発生する可能性があります。

アプローチはbefore { User.destroy_all }機能しますが、面倒で(他の仕様にも追加する必要がある場合があるため)、時間がかかります。

database_cleaner gemを利用し、rspec構成を次のように拡張することをお勧めします。

RSpec.configure do |config|
  config.use_transactional_fixtures = false

  config.before :suite do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with :truncation
  end

  config.before(:each) { DatabaseCleaner.start }
  config.after(:each)  { DatabaseCleaner.clean }
end

リクエストの仕様にCapybaraを使用している場合は、before :eachブロックを次のように変更します。

config.before :each do
  if Capybara.current_driver == :rack_test
    DatabaseCleaner.strategy = :transaction
  else
    DatabaseCleaner.strategy = :truncation
  end

  DatabaseCleaner.start
end
于 2012-10-24T16:29:02.490 に答える
0

これでうまくいくと思います

ユーザーのFactoryGirlを呼び出し、サブスクリプション呼び出しに渡します

@user = FactoryGirl.create(:user) 
@subscription = FactoryGirl.create(:subscription, :user_id => @user.id)

なぜこれが起こったのかというと、スペックをもっと見る必要があります

于 2012-10-24T08:26:08.267 に答える