2011-08-02 5 views
6

Correction. Il y avait un bug dans Rails. Voir https://github.com/rails/rails/issues/2333Rails 3.1, Bogue usine fille

J'ai un problème avec Rails Factory Girl et Rails 3.1.0.rc5

Quand je fais plus d'une fois user = FactoryGirl.create(:user) j'ai une erreur. Je peux créer autant d'utilisateurs que je veux en utilisant Factory mais seulement dans la console rails.

Tests:

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 
modèle

/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]) la cause du problème.

+0

C'est bizarre, et la fixation du problème de base serait mise ter, mais une chose que vous voudrez peut-être faire (une bonne pratique en général) est de créer votre utilisateur dans une méthode 'setup'. Il devient alors disponible pour tous les tests en cours. – MrDanA

+0

Est-ce que c'est réglé maintenant? S'il vous plaît accepter une réponse ... – WattsInABox

+0

Il y avait un bug dans les rails qui a causé cela. Voir ce https://github.com/rails/rails/issues/2333 pour plus d'informations. – chg

Répondre

0

Vous avez une ligne supplémentaire i votre factories.rb, il faut lire comme ceci:

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

J'utilise la version git de Factory-girls et votre code ne fonctionne pas. '/vendor/ruby/1.9.1/gems/factory_girl-2.0.1/lib/factory_girl/syntax/default.rb:6:in define ': nombre incorrect d'arguments (1 pour 0) (ArgumentError) ' Voir la documentation : [link] https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md – chg

+0

essayez d'utiliser Factory.define au lieu de FactoryGirl.define. Vous devrez peut-être essayer le joyau factory_girl_rails –

0

Cela devrait fonctionner:

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

D'une certaine façon la classe est pas correctement levé les yeux, et je ne suis pas sûr comment cela se produit, mais pourriez-vous essayer d'accéder différemment:

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