5

Rspec コントローラー テストで関連付けをテストしようとしています。問題は、Factory が attributes_for コマンドの関連付けを生成しないことです。したがって、この投稿の提案に従って、コントローラーの仕様で検証属性を次のように定義しました。

def valid_attributes
   user = FactoryGirl.create(:user)
   country = FactoryGirl.create(:country)
   valid_attributes = FactoryGirl.build(:entitlement, user_id: user.id, country_id: country.id, client: true).attributes.symbolize_keys
   puts valid_attributes
end

ただし、コントローラーのテストを実行すると、次のエラーが引き続き発生します。

 EntitlementsController PUT update with valid params assigns the requested entitlement as @entitlement
    Failure/Error: entitlement = Entitlement.create! valid_attributes
    ActiveRecord::RecordInvalid:
    Validation failed: User can't be blank, Country can't be blank, Client  & expert are both FALSE. Please specify either a client or expert relationship, not both

それでも、ターミナルの valid_attributes 出力は、各 valid_attribute に user_id、country_id があり、expert が true に設定されていることを明確に示しています。

  {:id=>nil, :user_id=>2, :country_id=>1, :client=>true, :expert=>false, :created_at=>nil, :updated_at=>nil}
4

1 に答える 1

4

putsメソッドの最後の行にa があり、 valid_attributesnil が返されているようです。そのため、それを渡すと、Entitlement.create!ユーザーと国が空白であるなどのエラーが発生します。

その行を削除してみてくださいputs。次のようになります。

def valid_attributes
  user = FactoryGirl.create(:user)
  country = FactoryGirl.create(:country)
  FactoryGirl.build(:entitlement, user_id: user.id, country_id: country.id, client: true).attributes.symbolize_keys
end

ちなみに、実際にはユーザーと国を作成してから、その ID を に渡す必要はありません。buildファクトリ自体に withusercountryin の行を含めるだけでそれを行うことができますentitlement。実行FactoryGirl.build(:entitlement)すると、自動的に作成されます (ただし、実際にはentitlementレコードは保存されません)。

于 2012-10-24T00:58:00.647 に答える