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

Popular posts from this blog

apache - Remove .php and add trailing slash in url using htaccess not loading css -

javascript - jQuery show full size image on click -