ruby on rails - Why is 'FactoryGirl.lint' giving InvalidFactoryError? -
long time reader first time poster here on :)
for last couple of days i've been setting factorygirl.
yesterday changed factories (mainly user , brand factories) replacing:
language.find_or_create_by_code('en')
with:
language.find_by_code('en') || create(:language)
because first option creates language object code attribute filled in; while second uses language factory create object (and fills in attributes specified in factory)
now when run test fails on factory.lint, stating user (and admin_user) factories invalid. reverting above code doesn't fix , stack trace provided factorygirl.lint
pretty useless..
when comment lint function, tests run fine without issues.
when manually create factory in rails console , use .valid?
on it, returns true i'm @ loss why lint considers factories invalid.
my user factory looks this:
factorygirl.define factory :user ignore lang { language.find_by_code('en') || create(:language) } end login "test_user" email "test_user@test.com" name "jan" password "test1234" password_confirmation "test1234" role # belongs_to :role brand # belongs_to :brand person # belongs_to :person language { lang } # belongs_to :language factory :admin_user association :role, factory: :admin end end end
here role, person , language factories pretty straightforward (just strings) brand factory shares same language user use code in ignore block factorygirl doesn't create 2 'en' language entries in database.
anyone has ideas why i'm getting invalidfactoryerror , maybe provide insights on how debug this?
update 1
it seems problem caused factory..
have factory called user_var_widget link specific widget user:
factory :user_solar_widget, :class => 'userwidget' sequence_number 2 user { user.find_by_login('test_user') } # || create(:user) } widget { widget.find_by_type('solarwidget') || create(:solar_widget) } end
if uncomment create(:user) part, invalidfactoryerror user factory. guess because there nothing in user factory states has user_widgets. experiment bit callbacks see if can resolve this.
update 2
i've managed solve adding user factory:
trait :with_widgets after(:create) |user| user.user_widgets << create(:user_solar_widget, user: user) end end
where user_widgets has_many association in user model.
changed user_solar_widget factory to:
factory :user_solar_widget, :class => 'userwidget' sequence_number 2 # removed user line widget { widget.find_by_type('solarwidget') || create(:solar_widget) } end
i create user calling:
create :user, :with_widgets
still, have been nice if lint function bit more specific invalid factories..
factorygirl.lint useless because of it's non-existent error messages. recommend instead including following test:
# based on https://github.com/thoughtbot/factory_girl/ # wiki/testing-all-factories-(with-rspec) require 'rails_helper' rspec.describe factorygirl described_class.factories.map(&:name).each |factory_name| describe "#{factory_name} factory" 'is valid' factory = described_class.build(factory_name) expect(factory) .to be_valid, -> { factory.errors.full_messages.join("\n") } end end end end
Comments
Post a Comment