web-dev-qa-db-fra.com

Rails 3.2, RSpec, Factory Girl: NameError: constante non initialisée Factory

J'ai suivi ce introduction à Rails tests et j'ai rencontré un problème que je ne peux pas trouver la solution. Je suis très familier avec Rails mais c'est ma première incursion dans les tests.

Quoi qu'il en soit, j'ai un test de modèle très basique, pas même complètement implémenté et quand j'essaie de lancer rspec spec/models/admin_spec.rb. J'obtiens l'erreur suivante dans le Admin has a valid factory ligne (code complet ci-dessous)

Admin has a valid factory
 Failure/Error: Factory.create(:admin).should be_valid
 NameError:
   uninitialized constant Factory
 # ./spec/models/admin_spec.rb:6:in `block (2 levels) in <top (required)>'

Je suppose que FactoryGirl n'est pas en cours de chargement pour une raison quelconque, mais j'avais l'impression qu'il devrait être chargé automatiquement. Ci-dessous, le code complet de mon Gemfile, /spec/models/admin_spec.rb et /spec/factories/admins.rb

Merci beaucoup pour votre aide

Gemfile

source 'https://rubygems.org'

gem 'Rails', '3.2.2'
gem 'mysql2'
gem 'jquery-Rails'
gem 'haml'
gem 'bcrypt-Ruby', :require => 'bcrypt'
gem 'bootstrap-sass', '~> 2.0.2'
gem 'capistrano'
gem 'json'
gem "Paperclip", '~>3.0'
gem 'airbrake'
gem 'acts_as_list'
gem 'nested_form', :git => 'https://github.com/ryanb/nested_form.git'
gem 'bootstrap-wysihtml5-Rails'
gem 'will_paginate', '~> 3.0'
gem 'bootstrap-will_paginate'
gem 'thinking-sphinx', '2.0.10'

gem 'sass-Rails', '~> 3.1'
gem 'coffee-Rails'
gem 'uglifier'
# gem 'compass'

group :development do
  gem 'awesome_print'
  gem 'wirble'
end

group :development, :test do
  gem 'rspec-Rails'
  gem 'factory_girl_Rails'
end

group :production do
  gem 'execjs'
  gem 'therubyracer'
end

group :test do
  # Pretty printed test output
  gem 'turn', :require => false
  gem 'faker'
  gem 'capybara'
  gem 'guard-rspec'
  gem 'launchy'
end

/spec/factories/admin.rb

require 'faker'

FactoryGirl.define do
  factory :admin do |f|
    f.name Faker::Name.name
    f.email Faker::Internet.email
  end
end

/spec/models/admin_spec.rb

require 'spec_helper'

describe Admin do
  it "has a valid factory" do
    Factory.create(:admin).should be_valid
  end
  it "is invalid without a name"
  it "is invalid without an email"
end
40
chrisgooley

Ça devrait être FactoryGirl.create au lieu. Apparemment, Factory était obsolète et a maintenant été supprimé, regardez les commentaires dans le lien que vous avez fourni :)

122
Anthony Alberto

En fait, dans votre spec_helper.rb sous Rspec.configure do...end vous pouvez ajouter

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
end 

Cela vous évitera le problème du préfixe FactoryGirl. avant :build et :create au total:

nécessite 'spec_helper'

describe Admin do
  it "has a valid factory" do
    create(:admin).should be_valid
  end
  it "is invalid without a name"
  it "is invalid without an email"
end

Voir: Documentation FactoryGirl

10
Vikram

Ce n'est pas une réponse à votre question, mais j'ai remarqué qu'il y a une erreur obscure dans votre utilisation de Faker avec FactoryGirl. f.name et f.email seront les mêmes pour chaque FactoryGirl.create ou FactoryGirl.build.

f.name Faker::Name.name
f.email Faker::Internet.email

Ajoutez des accolades autour des appels Faker afin que chaque référence à une usine génère des données Faker aléatoires.

f.name { Faker::Name.name }
f.email { Faker::Internet.email }
9
scarver2

Assurez-vous également que vous incluez l'instruction require dans votre fichier spec_helper.rb.

require 'factory_girl_Rails'
1
El3ktra