web-dev-qa-db-fra.com

Usine non enregistrée

Je veux tester un modèle avec RSpec mais je suis probablement tombé sur une faute de frappe que je ne trouve pas. Quelqu'un peut-il m'aider s'il vous plaît un peu? Cela fait longtemps que je lutte avec cela et je ne trouve aucune erreur. Merci d'avance!

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

erreur

Factory not registered: user
29
Kert

Vous avez votre définition d'usine dans le mauvais fichier, selon votre question, il se trouve dans user.rb. Cela doit être dans un fichier factories.rb de votre dossier de test (spec) si vous utilisez rspec

# user.rb

FactoryGirl.define do
    factory :user do |f|
        f.email "[email protected]"
        f.password "Ruby"
        f.password_confrimation "Ruby"
    end
end

Changer ci-dessus à cela, (vous n'avez pas non plus besoin de la variable f)

# spec/factories.rb

FactoryGirl.define do
    factory :user do
        email "[email protected]"
        password "Ruby"
        password_confrimation "Ruby"
    end
end

De plus, comme le disent les commentaires, assurez-vous que gem 'factory_girl_Rails' est dans votre Gemfile, au lieu de simplement gem 'factory_girl'

34
fontno

J'avais rencontré le problème suivant avec la structure dans mon dossier 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

C'était donc charger l'artiste avant que l'objet technique ne soit chargé. Donc, il n'a pas pu le trouver. La solution consiste à ne pas utiliser FactoryBot imbriqué créer dans des usines ni à renommer vos usines imbriquées en quelque chose qui précède votre usine parente. 

Je viens de déménager mon atelier technique. à factories.rb et défini ici. Et le problème a été résolu.

1
zhisme

J'ai eu le même problème et la seule chose que j'ai ajoutée était un fichier factories.rb. Tous les tests ont passé de cela. 

0
Kyle Poretto