11

FactoryGirlドキュメントの例を次に示します。

FactoryGirl.define do
  factory :post do
    name "Post name"
    user
  end
end

この例でuserは、別のファクトリを呼び出しています。私がやりたいことは、効果的に を呼び出すことですがuser.id、それを属性の定義として設定することです。以下は簡略化された例です。

**models/job.rb**
  ...
  belongs_to :assignee, :class_name => "User"
  belongs_to :user
  ...
  attr_accessible :assignee_id, :user_id
  ...
end


**factories/jobs.rb**
FactoryGirl.define do
  factory :job do
    assignee_id user.id      #what I would like to do, but triggers "undefined method 'id'" error
    user_id user.id          #user_id is an attribute of the model and is the job assignor
 end

エイリアスについて説明しているドキュメントの一部を取り入れようとしましたが、うまくいきませんでした:

FactoryGirl.define do
  factory :user, :aliases => [:assignee] do
  ....

私は(希望?)私はここに近づいているように感じますが、洞察をいただければ幸いです。ありがとう。

編集: このコードは私の仕様を実行します!

**factories/jobs.rb**

FactoryGirl.define do
  factory :job do
    before(:create) do |job|
      user = FactoryGirl.create(:user)
      job.assignee = user
      job.user  = user
    end

  association :assignee, factory: :user
  association :user, factory: :user
  sequence(:user_id) { |n| n }
  sequence(:assignee_id) { |n| n }
  ...
end

そして、それは私のit { should be_valid }仕様に合格しているので、工場は問題ないようですが、私が呼び出すときに仕様自体にリファクタリングがあると思いますFactoryGirl.create.

上記のコードには、mguymon からの提案が組み込まれています。ありがとう!

最終更新

Hartl のモデル アソシエーションに関する議論に戻って再読した後、私はこの問題を解決することができました。上記は技術的には有効でしたが、仕様でジョブをビルドまたは作成したときに、実際には属性を適切に渡しませんでした。これが私が持っていたはずのものです:

FactoryGirl.define do
  factory :job do
    association :assignee, factory: :user
    user
  end
end

私の問題は、仕様でファクトリを作成する方法にも起因していたので、次のようにする必要がありました (しかし、そうではありませんでした...ため息):

    let(:user) { create(:user) }
    before { @job = create(:job, user: @user) }

工場に明示的に持つ必要はないようですし、上からのブロックassociation :userも必要ないようです。before

余談ですが、ステートメントputs @job内に含めることでデバッグしたり、属性が適切にロードされていることを確認するために呼び出したりできることも学びました。その特定の仕様が実行されると、ステートメントは仕様のすぐそばまたは仕様から出力されます。expect@job.assignee_idputsF.

4

1 に答える 1