【问题标题】:Rails 3.1, Factory girl bugRails 3.1,工厂女孩错误
【发布时间】:2011-08-02 13:53:58
【问题描述】:

已修复。 Rails 中有一个错误。见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

工厂.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

模型/用户.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 =&gt; self[column]) 导致问题。

【问题讨论】:

  • 这很奇怪,解决根本问题会更好,但您可能想要做的一件事(一般是良好的做法)是在setup 方法中创建您的用户。然后它可用于所有正在进行的测试。
  • 现在解决了吗?请接受答案...
  • rails 中有一个错误导致了这种情况。请参阅此github.com/rails/rails/issues/2333 了解更多信息。

标签: ruby-on-rails ruby ruby-on-rails-3 factory-bot


【解决方案1】:

不知何故未正确查找该类,我不确定这是如何发生的,但您可以尝试以不同的方式访问它吗:

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

【讨论】:

    【解决方案2】:

    你的 factory.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
    

    【讨论】:

    • 我正在使用 git 版本的 Factory-girls 并且您的代码不起作用。 /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) 见文档:[链接]github.com/thoughtbot/factory_girl/blob/master/…
    • 尝试使用 Factory.define 而不是 FactoryGirl.define。您可能需要尝试 factory_girl_rails gem
    【解决方案3】:

    这应该可行:

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

    【讨论】:

      猜你喜欢
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多