Rspec电子邮件测试下降(Rails教程)

时间:2014-01-19 23:00:07

标签: ruby-on-rails ruby rspec

我在rails教程的第6章,我正在运行一个rspec,它正在下降并给我这个。

Failures:

  1) User when email address is already taken 
     Failure/Error: user_with_same_email.save
     NoMethodError:
       undefined method `save' for "USER@EXAMPLE.COM":String
     # ./spec/models/user_spec.rb:55:in `block (3 levels) in <top (required)>'

Finished in 0.43101 seconds
21 examples, 1 failure

Failed examples:

rspec ./spec/models/user_spec.rb:58 # User when email address is already taken

我无法弄清楚为什么它会给我一个未定义的方法。这是我的考试

测试

require 'spec_helper'

describe User do

  before { @user = User.new(name: "Example User", email: "user@example.com") }

  subject { @user }

  it { should respond_to(:name) }
  it { should respond_to(:email) }
  it { should respond_to( :password_digest) }

  it { should be_valid }

  describe "when name is not present" do
    before { @user.name = " " }
    it { should_not be_valid }
  end

  describe "when name is too long" do
    before { @user.name = "a" * 51 }
    it { should_not be_valid }
  end

  describe "when email is not present" do
    before { @user.email = " " }
    it { should_not be_valid }
  end

  describe "when email format is invalid" do
    it "should be invalid" do
      addresses = %w[user@foo,com user_at_foo.org example.user@foo.
                     foo@bar_baz.com foo@bar+baz.com]
      addresses.each do |invalid_address|
        @user.email = invalid_address
        expect(@user).not_to be_valid
      end
    end
  end

  describe "when email format is valid" do
    it "should be valid" do
      addresses = %w[user@foo.COM A_US-ER@f.b.org frst.lst@foo.jp a+b@baz.cn]
      addresses.each do |valid_address|
        @user.email = valid_address
        expect(@user).to be_valid
      end
    end
  end

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

    it { should_not be_valid }
  end
end

我的用户模型

class User < ActiveRecord::Base
    before_save { self.email = email.downcase }
    validates :name, presence: true, length: { maximum: 50 }
    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 }
end

如果我遗漏了任何内容,这是github

1 个答案:

答案 0 :(得分:1)

在您的规范中的这一行:

    user_with_same_email = @user.email.upcase

您正在将用户对象转换为字符串(电子邮件地址)。字符串没有保存方法,因此出现错误消息。