Rails 3.1,Factory Girl Bug

6

已解决。Rails 中有一个 bug。请参见 https://github.com/rails/rails/issues/2333

我在使用 Factory Girl Rails 和 Rails 3.1.0.rc5 时遇到了问题。

当我执行多次 user = FactoryGirl.create(:user) 时,会出现错误。

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

我可以使用Factory在Rails控制台中创建任意数量的用户。

测试:

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

model/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+\-.]+@[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]) 导致了问题。


该代码导致了问题。

这很奇怪,修复根本问题会更好,但你可能想做的一件事(通常是一个好习惯)是在setup方法中创建用户。然后它就可以在所有后续测试中使用了。 - MrDanA
现在是否已经解决了?请采纳一个答案... - WattsInABox
Rails 中有一个 bug 导致了这个问题。请查看 https://github.com/rails/rails/issues/2333 获取更多信息。 - chg
3个回答

3

某种原因导致这个类没有被正确地查找到,我不确定是怎么发生的,但你可以尝试以不同的方式访问它:

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

0

你的 factories.rb 文件多了一行,应该像这样写:

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

我正在使用Factory-girl的git版本,但你的代码无法运行。/vendor/ruby/1.9.1/gems/factory_girl-2.0.1/lib/factory_girl/syntax/default.rb:6:in define': wrong number of arguments (1 for 0) (ArgumentError)请参考文档:[链接]https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md - chg
尝试使用Factory.define而不是FactoryGirl.define。您可能需要尝试factory_girl_rails gem。 - Mario Visic

0

这应该可以正常工作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接