Ruby on Rails教程 - Michael Hartl - 测试“用户何时收到电子邮件地址”

时间:2013-10-29 15:53:24

标签: ruby-on-rails ruby

测试“用户何时已收到电子邮件地址”时出现问题,以下是我运行测试时显示的内容

1) User when email address is already taken
 Failure/Error: user_with_same_email = @user.dup
 NoMethodError:
   private method `initialize_dup' called for #<User:0x007f9710c7c528>
 # ./spec/models/user_spec.rb:78:in `block (3 levels) in <top (required)>'

我没有意识到我将其定义为私人,我无法打电话。

这是测试

    describe "when email address is already taken" do
    before do
        user_with_same_email = @user.dup
        user_with_same_email.email = @user.email.upcase
        user_with_same_email.save
    end

    it { should_not be_valid }
end

这里是用户模型

class User < ActiveRecord::Base
  attr_accessible :email, :name, :password, :password_confirmation
  has_secure_password

  has_many :microposts, dependent: :destroy

  before_save { self.email.downcase! }
  before_save :create_remember_token

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }

  validates :name, presence: true, length: { maximum: 50}

  validates :password, length: { minimum: 6 }

  validates :password_confirmation, presence: true

  private
  def create_remember_token
    self.remember_token = SecureRandom.urlsafe_base64
  end

end

谢谢

3 个答案:

答案 0 :(得分:1)

这是Rails 3.2.12中的一个带有ruby 2的错误。看看这个https://github.com/rails/rails/issues/9417。切换到Rails 3.2.15可以解决您的问题。

答案 1 :(得分:1)

这真的是对#34的评论;它似乎又回到了4.0.2 - 1月10日22:58&#34;

我所做的就是强迫它公开:

@my_object.errors.class_eval do
  def initialize_dup(other) # :nodoc:
     @messages = other.messages.dup
     super
  end
end
@my_object.errors.initialize_dup(another_object.errors)

我很欣赏一些投票,以便我可以获得足够的积分,以便stackoverflow允许我发表评论:)

答案 2 :(得分:0)

根据我的类似票证Rails 4 Validating email uniqueness without case_sensitive中接受的答案,这似乎是对MySQL的性能和区分大小写的验证之间的不可调和的折衷。有两个GitHub问题的链接显示实现的一些翻转,但似乎没有任何完全令人满意的解决方案可能。这里有几种解决方法。