0

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つになります。

4

1 に答える 1

1
  def valid_attributes
    {
        "name" => "A Person",
        "brain_attributes" => { "weight_kg" => "25" }
    }

または

  def valid_attributes
    {
        "name" => "A Person",
        "brain_attributes" => FactoryGirl.attributes_for(:brain)
    }
于 2013-02-15T18:32:18.757 に答える