2011-08-02 14 views
6

Fijo. Hubo un error en Rails. Ver https://github.com/rails/rails/issues/2333Rails 3.1, Error de niña de fábrica

tengo un problema con rieles chica de la fábrica y los rieles 3.1.0.rc5

Cuando lo haga más de una vez user = FactoryGirl.create(:user) Tengo un error.

Failure/Error: user = FactoryGirl.create(:user) 
NameError: 
    uninitialized constant User::User 
# ./app/models/user.rb:17:in `generate_token' 
# ./app/models/user.rb:4:in `block in <class:User>' 
# ./spec/requests/users_spec.rb:20:in `block (3 levels) in <top (required)>' 

Puedo crear tantos usuarios como quiera utilizando la fábrica pero solo en la consola de rieles.

Pruebas:

require 'spec_helper' 

describe "Users" do 

    describe "signin" do 

    it "should sign in a user" do 
     visit root_path 
     user = FactoryGirl.create(:user) 
     within("div#sign_in_form") do 
     fill_in "Name", with: user.name 
     fill_in "Password", with: user.password 
     end 
     click_button "Sign in" 
     current_path.should eq(user_path(user)) 
     page.should have_content("signed in") 
    end 

    it "should not show new user form on /" do 
     user = FactoryGirl.create(:user) 
      visit root_path 
     page.should_not have_css("div#new_user_form") 
    end 
    end 
end 

factories.rb modelo

FactoryGirl.define do 
    factory :user do |f| 
    f.sequence(:name) { |n| "john#{n}" } 
    f.fullname 'Doe' 
    f.sequence(:email) { |n| "test#{n}@example.com" } 
    f.password 'foobar' 
    end 
end 

/user.rb

class User < ActiveRecord::Base 
    has_secure_password 
    attr_accessible :name, :fullname, :email, :password 
    before_create { generate_token(:auth_token) } 

    email_regex = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :name, presence: true, length: { maximum: 20 }, 
      uniqueness: { case_sensitive: false } 
    validates :fullname, presence: true, length: { maximum: 30 } 
    validates :email, format: { with: email_regex }, 
      uniqueness: { case_sensitive: false }, length: { maximum: 30 } 
    validates :password, length: { in: 5..25 } 

    def generate_token(column) 
    begin 
     self[column] = SecureRandom.urlsafe_base64 
    end while User.exists?(column => self[column]) 
    end 
end 

User.exists?(column => self[column]) causa el problema.

+0

Eso es extraño, y se solucionaría el problema de raíz ter, pero una cosa que puede querer hacer (buenas prácticas en general) es crear a su usuario en un método de "configuración". Luego se vuelve disponible para todas las pruebas de procedimiento. – MrDanA

+0

¿Esto está arreglado ahora? Acepte una respuesta ... – WattsInABox

+0

Hubo un error en los rieles que causó eso. Consulte este https://github.com/rails/rails/issues/2333 para obtener más información. – chg

Respuesta

0

Tienes una línea extra i tu factories.rb, debe decir así:

FactoryGirl.define :user do |f| 
    f.sequence(:name) { |n| "john#{n}" } 
    f.fullname 'Doe' 
    f.sequence(:email) { |n| "test#{n}@example.com" } 
    f.password 'foobar' 
end 
+0

Estoy usando la versión git de Factory-girls y su código no funciona. '/vendor/ruby/1.9.1/gems/factory_girl-2.0.1/lib/factory_girl/syntax/default.rb:6:in define ': número incorrecto de argumentos (1 para 0) (ArgumentError) ' Ver documentación : [link] https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md – chg

+0

intente con Factory.define en lugar de FactoryGirl.define. Es posible que tengas que probar la gema factory_girl_rails –

0

esto debería funcionar:

FactoryGirl.define do 
    factory :user do 
    sequence(:name) { |n| "john#{n}" } 
    fullname 'Doe' 
    sequence(:email) { |n| "test#{n}@example.com" } 
    password 'foobar' 
    end 
end 
3

De alguna manera la clase no es propiamente la mirada, y no estoy seguro de cómo sucede esto, pero ¿podría intentar acceder a él de manera diferente?

def generate_token(column) 
    begin 
    self[column] = SecureRandom.urlsafe_base64 
    end while self.class.exists?(column => self[column]) 
end