2011-08-02 13 views
6

Naprawiono. Wystąpił błąd w Railsach. Zobacz https://github.com/rails/rails/issues/2333Rails 3.1, błąd fabryczny dziewczyna

mam problem z Dziewczyna z fabryki i szyny 3.1.0.rc5

Kiedy zrobić więcej niż raz user = FactoryGirl.create(:user) mam błąd.

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)>' 

Mogę utworzyć tyle użytkowników, ile chcę, używając Factory, ale tylko w konsoli szyn.

Testy:

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

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 

modelu/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]) powoduje problem.

+0

To dziwne, a naprawienie problemu root byłoby ter, ale jedną rzeczą, którą możesz chcieć zrobić (dobra praktyka w ogóle) jest stworzenie użytkownika w metodzie "setup". Następnie staje się dostępny dla wszystkich testów postępowania. – MrDanA

+0

Czy to teraz naprawiono? Proszę przyjąć odpowiedź ... – WattsInABox

+0

Wystąpił błąd w szynach, który spowodował to. Zobacz ten https://github.com/rails/rails/issues/2333, aby uzyskać więcej informacji. – chg

Odpowiedz

0

Masz dodatkową linię i swoją factories.rb, należy czytać tak:

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

Używam wersji git Factory-girls, a twój kod nie działa. '/vendor/ruby/1.9.1/gems/factory_girl-2.0.1/lib/factory_girl/syntax/default.rb:6:in define ': zła liczba argumentów (1 za 0) (ArgumentError) ' Zobacz dokumentację : [link] https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md – chg

+0

spróbuj użyć Factory.define zamiast FactoryGirl.define. Być może będziesz musiał spróbować gem gem_love_rails –

0

To powinno działać:

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

Jakoś klasa nie jest prawidłowo wzrok, i nie jestem pewien, jak to się dzieje, ale czy mógłbyś spróbować uzyskać dostęp do niego w inny sposób:

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