I want to test a model with RSpec but I probably have stumbled on a typo that I just can't find. Can somebody please help me a bit? I've been struggling with it for a long time and just can't find any mistakes. Thank you in advance!
user_spec.rb
require 'spec_helper' describe User do it "has a valid factory" do FactoryGirl.build(:user).should be_valid end it "is invalid without an e-mail" it "is invalid without a correct e-mail" it "is invalid without a password" it "is invalid without a matching password confrimation" end
user.rb
FactoryGirl.define do factory :user do |f| f.email "[email protected]" f.password "ruby" f.password_confrimation "ruby" end end
spec_helper.rb
# This file is copied to spec/ when you run 'rails generate rspec:install' ENV["RAILS_ENV"] ||= 'test' require File.expand_path("../../config/environment", __FILE__) require 'rspec/rails' require 'rspec/autorun' require 'factory_girl' # Requires supporting ruby files with custom matchers and macros, etc, # in spec/support/ and its subdirectories. Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f } RSpec.configure do |config| # ## Mock Framework # # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line: # # config.mock_with :mocha # config.mock_with :flexmock # config.mock_with :rr # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures config.fixture_path = "#{::Rails.root}/spec/fixtures" # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, remove the following line or assign false # instead of true. config.use_transactional_fixtures = true # If true, the base class of anonymous controllers will be inferred # automatically. This will be the default behavior in future versions of # rspec-rails. config.infer_base_class_for_anonymous_controllers = false # Run specs in random order to surface order dependencies. If you find an # order dependency and want to debug it, you can fix the order by providing # the seed, which is printed after each run. # --seed 1234 config.order = "random" end
error
Factory not registered: user
You have your factory definition in the wrong file, according to your question it is in user.rb. This needs to be in a factories.rb in your test folder (spec) if you use rspec
# user.rb FactoryGirl.define do factory :user do |f| f.email "[email protected]" f.password "ruby" f.password_confrimation "ruby" end end
Change above to this, (Also you don't need the f variable)
# spec/factories.rb FactoryGirl.define do factory :user do email "[email protected]" password "ruby" password_confrimation "ruby" end end
Also as the comments say, make sure gem 'factory_girl_rails'
is in your Gemfile
, instead of just gem 'factory_girl'
I had run into the following issue with the structure in my folder factories/ - factories/ -- artists.rb -- techniques.rb
artists.rb
FactoryBot.define do factory :artist do name 'Michael' technique FactoryBot.create :technique end end
techniques.rb
FactoryBot.define do factory :technique do name 'Some name' end end
So it was loading artist before technique object were loaded. So it couldn't find it. The solution is to not use nested FactoryBot create in factories or rename your nested factories to something that stands before your parent factory.
I just moved my technique factory. to factories.rb
and defined it there. And issue was resolved.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With