4

私は次のモデルを持っています:

class Team < ActiveRecord::Base
  # Setup accessible (or protected) attributes for your model
  attr_accessible :name
  validates_presence_of :name

  belongs_to :user

end

これは次の方法でテストされます:

describe Team do

  before(:each) do
    @attr = FactoryGirl.attributes_for(:team)
  end

  it "should belong to a user" do
    @team = Team.create!(@attr)
    @team.should belong_to(:user)
  end
end

そして、私は次の工場を持っています:

FactoryGirl.define do
  factory :team do
    name 'Dream Team'
    sport
    user
  end
end

FactoryGirl.define do
  factory :user do
    name 'Test User'
    last_name 'Last Name'
    email 'example@example.com'
    password 'changeme'
    password_confirmation 'changeme'
  end
end

仕様をテストすると、次のエラーが発生します。

1) チームはユーザーに属している必要があります 失敗/エラー: @team = Team.create!(@attr) ActiveRecord::StatementInvalid: SQLite3::ConstraintException: team.user_id may not be NULL: INSERT INTO "teams" ("created_at" , "name", "sport_id", "updated_at", "user_id") 値 (?, ?, ?, ?, ?)

何故ですか?ドキュメントでは、関連付けを設定するには、ファクトリー名を書くだけでよいと書かれています。私の場合はユーザーです。

ありがとう

4

2 に答える 2

4

FactoryGirl.attributes_for関連属性を含まない、指定されたモデルのみの属性を含むハッシュを提供します-あなたの場合、user_id.

が必須フィールドで、を使用しuser_idて のインスタンスを作成しようとすると、エラーが発生します。TeamFactoryGirl.create(attributes_for(:team))

ただし、これを使用するFactoryGirl.create(:team)と、 の有効なインスタンスが得られるはずですTeam

于 2013-03-30T20:55:22.667 に答える
0

before(:each)The Rails 4 Way Chapter 21 によると、FactoryGirl と Rspec を一緒に使用するべきではありません。実際、このテストを作成するより洗練された方法はlet(:team) { FactoryGirl.create(:team }、 it ステートメントの前に使用することです。

これにより、多くのインスタンス変数を使用する必要がなくなります。必要に応じて、この説明が不十分な場合は例を提供できます

于 2015-01-08T19:48:49.337 に答える