rspecコントローラーの仕様で、valid_attributes
モデルのhas_one
関連付け時にメソッドを定義する正しい方法は何ですか?
* Rails 3.2.12、rspec 2.12、factory_girl_rails 4.2.1 *
次のように、PersonとBrainの2つのモデルを使用して新しいRailsプロジェクトを作成する場合:
rails new crowd
cd crowd
rails g scaffold person name:string
rails g scaffold brain weight_kg:float
(そしてそれらを関連付けるためにすべてのレッグワークを行います)、あなたはこれらのモデルで終わることができます:
class Brain < ActiveRecord::Base
belongs_to :person
attr_accessible :weight_kg
attr_accessible :person
attr_accessible :person_attributes
accepts_nested_attributes_for :person
end
class Person < ActiveRecord::Base
has_one :brain
attr_accessible :name
attr_accessible :brain
attr_accessible :brain_attributes
accepts_nested_attributes_for :brain
validates :brain, :presence => { :message => "Please give me a brain" }
end
spec / controllers / people_controller_spec.rbの関連する自動生成コンテンツ:
describe PeopleController do
def valid_attributes
{
"name" => "A Person",
}
end
この時点で、valid_attributesはPersonには無効です。これは、Brainが欠落しているためです。さて、1つ追加しましょう。しかし、どのように?
間違い:
def valid_attributes
{
"name" => "A Person",
"brain" => { "weight_kg" => "25" }
}
end
^生成しますActiveRecord::AssociationTypeMismatch: Brain(#86698290) expected, got ActiveSupport::HashWithIndifferentAccess(#84831840)
間違い:
def valid_attributes
{
"name" => "A Person",
"brain" => Brain.new(:weight_kg => 25)
}
end
^保存されないからです。エラーはととExpected response to be a <:redirect>, but was <200>
他expected persisted? to return true, got false
の2つになります。
間違った:(有効なspec/factorys / brain.rbを想定)
def valid_attributes
{
"name" => "A Person",
"brain" => FactoryGirl.build(:brain),
}
end
person
^これも作成/更新時にレコードを保存しないため、これは間違っています。エラーはととExpected response to be a <:redirect>, but was <200>
他expected persisted? to return true, got false
の2つになります。