Factory Not Registered in rspec but found in console

2.7k views Asked by At

I have the followed

group :test, :development do
gem 'rspec-rails', '~> 3.0'
gem "guard-rspec"



gem 'capybara'
gem 'factory_girl_rails'
gem 'turn'
gem 'guard' # NOTE: this is necessary in newer versions
gem 'poltergeist'
gem 'phantomjs', :require => 'phantomjs/poltergeist'

gem 'selenium-webdriver'
gem 'capybara-screenshot'
gem 'capybara-webkit'
gem 'zeus'
gem "parallel_tests"
gem 'launchy'
gem 'email_spec'
gem 'action_mailer_cache_delivery'

gem 'protractor-rails'
gem 'database_cleaner'

and in my spec_helper.rb

require 'capybara/rspec'
require 'factory_girl_rails'
require 'support/request_helpers'

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
  config.include RequestHelpers
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|

    mocks.verify_partial_doubles = true
  end

end

Finally I have such a spec helper in the spec/support/request_helper.rb

module RequestHelpers
  def create_logged_in_user
    user = create(:user)
    login(user)
    user
  end

  def login(user)
    login_as user, scope: :user
  end
end

and factories.rb

# /spec/factories/factories.rb
FactoryGirl.define do
  factory :user do
    first "John"
    last 'Smith'
    email '[email protected]'
    password 'johnsmith123'
  end
end

Yes everytime I run rpsec it shows that

Factory not registered: user

And when I rune FactoryGirl.factories in the rails console, i can see 'user' is registered

=> #<FactoryGirl::Registry:0x007fa4e0e18160
 @items=
{
    :user=>
        #<FactoryGirl::Factory:0x007fa4e2371200
         @aliases=[],
         @class_name=nil,
         @compiled=false,
         @definition=
          #<FactoryGirl::Definition:0x007fa4e2370f58
           @additional_traits=[],
           @attributes=nil,
           @base_traits=[],
           @callbacks=[],
           @compiled=false,
           @constructor=nil,
           @declarations=
            #<FactoryGirl::DeclarationList:0x007fa4e2370ee0
             @declarations=
              [#<FactoryGirl::Declaration::Static:0x007fa4e2370b48 @ignored=false, @name=:first, @value="john">,
               #<FactoryGirl::Declaration::Static:0x007fa4e2370a80 @ignored=false, @name=:last, @value="smith">,
               #<FactoryGirl::Declaration::Static:0x007fa4e23709b8 @ignored=false, @name=:email, @value="[email protected]">,

I read through the Github setup docs for factory_girl_rails, rspec-rails multiple times but found no solution.

Does anyone know where I should look to detect the problem?

Thanks!

EDITED added contents of spec/rails_helper.rb updated Wed, 10 Jun 2015

ENV['RAILS_ENV'] ||= 'test'
require 'spec_helper'
require File.expand_path('../../config/environment', __FILE__)
require 'rspec/rails'
require 'capybara/poltergeist'
require 'capybara-screenshot/rspec'
Capybara.register_driver :poltergeist do |app|
    Capybara::Poltergeist::Driver.new(app, :phantomjs => Phantomjs.path, :inspector => true)
end
Capybara.javascript_driver = :webkit
include Warden::Test::Helpers

RSpec.configure do |config|
  config.infer_spec_type_from_file_location!
end
1

There are 1 answers

0
Lucas Emerick On BEST ANSWER

I had the same issue

Why is FactoryBot not finding our factories only inside RSpec, I do not know. But making FactoryBot explicitly find my definitions worked.

So you just need to add this to your spec_helper: FactoryBot.find_definitions

in my case, I followed the general instructions in this answer: https://stackoverflow.com/a/49436531/8790125 So I create a file spec/support/factory_bot.rb with this code (note the find_definitions):

require 'factory_bot'

RSpec.configure do |config|
    config.include FactoryBot::Syntax::Methods
    FactoryBot.find_definitions
end

and then required on rails_helper:

# ...
require 'rspec/rails'
require 'support/factory_bot'
# ...