简体   繁体   中英

FactoryGirl creating multiple records

I'm trying to get in the habit of writing specs, however, this is becoming increasingly frustrating.

Assume I have two simple models: User and Story . Each model uses a belongs_to relation. Each model uses a validates :foo_id, presence: true as well.

However, FactoryGirl is creating multiple records.

FactoryGirl.define do
  factory :user do
    email "foo@bar.com"
    password "foobarfoobar"
  end # this creates user_id: 1

  factory :story do
    title "this is the title"
    body "this is the body"
    user # this creates user_id: 2
  end
end

This simple test fails:

require 'rails_helper'

describe Story do

  let(:user) { FactoryGirl.create(:user) }
  let(:story) { FactoryGirl.create(:story) }

  it 'should belong to User' do
    story.user = user
    expect(story.user).to eq(user)
  end
end

What am I missing here? I cannot build a Story factory without a User , yet I need it to be just one User record.

The values you define for each attribute in a factory are only used if you don't specify a value in your create or build call.

user = FactoryGirl.create(:user)
story = FactoryGirl.create(:story, user: user)

Yes, it is a feature of factory girl to create the associated user when you create the story.

You can avoid it like this:

require 'rails_helper'

describe Story do
  let(:story) { FactoryGirl.create(:story) }
  let(:user) { story.user }

  it 'should belong to User' do
    story.user.should eq user
  end
end

This example is setup to be trivially true , but you get the point.

When doing something like this you can do:

let(:story) { FactoryGirl.create(:story, user: user) }

Or maybe you can only let the story variable and do:

let(:story) { FactoryGirl.create(:story, user: user) }
let(:user)  { User.last}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM