0

私は本当にアソシエーションをすることを理解していません。spec_helperで私は持っています

def log_in_user
  user = User.find_by_name 'User1'
  user = FactoryGirl.create :user1 unless user
  sign_in user
end

rspecで

let(:product) { FactoryGirl.build :product_A }


describe "GET confirm purchase" do
    it "xxx" do
      log_in_user

      Product.should_receive(:find_active_by_id).with("1").and_return(product)

       ...
   end
end

factorys.rb

FactoryGirl.define do
    factory :user do
        encrypted_password 'abcdef1'
        confirmed_at Time.now

            factory :user1 do
              email 'user1@test.com'
              name 'User1'
              year 1984
            end
    end

    factory :product do
        factory :product_A do
          name "product A"
          association :user, factory: :user1
        end
    end
end

テストケースを実行すると、例外が発生します:ActiveRecord :: RecordInvalid:検証に失敗しました:電子メールはすでに受信されています

user1が2回作成しているようです。1つはlog_in_userに、もう1つはfactoryに作成されています:association:user、factory :: user1

私は正しいですよ?はいの場合、どうすればこれを解決できますか?ユーザーを作成し、工場製品でアソシエーションを定義したい

一番

4

1 に答える 1

2

ファクトリ:product_Aを作成すると、自動的にファクトリが呼び出され:user1ます。

:user1次に、で再度ファクトリを作成しますlog_in_userが、一意の電子メールの検証により、2番目の電子メールが:user1作成されません。

私はあなたがそのように電子メールを作ることをお勧めしますsequence

FactoryGirl.define do
  sequence :email do |n|
    "user#{n}@test.com"
  end

  factory :user do
    encrypted_password 'abcdef1'
    confirmed_at Time.now

    factory :user1 do
      email
      name 'User1'
      year 1984
    end
  end

  factory :product do
    factory :product_A do
      name "product A"
      association :user, factory: :user1
    end
  end

end

次に、sign_in_user(オプションの)ユーザーを次のようなオプションとして使用するように変更します。

def log_in_user(user)
  user =|| User.find_by_name 'User1'
  user =|| FactoryGirl.create :user1
  sign_in user
end

そして、テストケースを変更して、そのユーザーオブジェクトをログインに渡します。

let(:product) { FactoryGirl.build :product_A }

describe "GET confirm purchase" do
  it "xxx" do
    log_in_user(product.user)
    Product.should_receive(:find_active_by_id).with("1").and_return(product)
 end
end
于 2012-12-19T21:41:05.617 に答える