ruby on rails - How to use factorygirl to associate user_id -
i learning tests using rails testing tools, mainly: rspec, factory_girl, shoulda, , faker gems.
i want test has_one , belongs_to associations. have user.rb (with name) , address.rb (with street, city, , user_id) models.
i trying figure out how create fake associations using fakers. want create fake street , associate fake user, can't figure out how on spec/factories/addresses.rb
this have:
factorygirl.define factory :address street {faker::address.street_address} city {faker::address.city} #creates fake user , use user's id user_id)# user = build(:user, name: "joe", id: 2) user_id {user.id} end end this spec/models/address_spec.rb
require 'rails_helper' rspec.describe address, type: :model "has valid factory" address = build(:address) expect(address).to be_valid end {should belong_to(:user)} end when run it, shows add_attribute': wrong number of arguments (given 3, expected 1..2) (argumenterror) error. tried removing id on argument , did user = build(:user, name: "joe") same error message still shows.
the test passes if don't include user lines on addresses factory. confirmed address has belongs_to :user , user has has_one :address.
is possible generate fake association , associate address fake user.id? test address's user_id well.
edit - following related factories , models:
factories
addresses.rb
factorygirl.define factory :address street {faker::address.street_address} city {faker::address.city} user end end users.rb
factorygirl.define factory :user name {faker::name.name} end end spec/models
address_spec.rb
require 'rails_helper' rspec.describe address, type: :model "has valid factory" association user specific_user = build(:user, name: 'joe') address = build(:address, specific_user) expect(address).to be_valid end {should belong_to(:user)} end error running address_spec.rb
nameerror: undefined local variable or method `user' #<rspec::examplegroups::address:0x00000001a94b00> # ./spec/models/addres
i think way build association incorrect. see https://github.com/thoughtbot/factory_girl/blob/master/getting_started.md#associations.
if want more specific associated user eg name: joe, id: 2, it's better in spec.
factory:
factorygirl.define factory :address street {faker::address.street_address} city {faker::address.city} user end end spec:
"has valid factory" specific_user = build(:user, name: 'joe') address = build(:address, specific_user) expect(address).to be_valid end
Comments
Post a Comment