rspec测试在expect(user.save).to_true上失败

时间:2015-05-28 18:02:33

标签: ruby-on-rails rspec

使用rails 4.1.8和rspec 3.2.1

此测试在我的rspec gem为2.0的其他应用程序中通过。

它也适用于开发模式。如果我使用全部大写的电子邮件创建用户,它将以小写形式保存在数据库中。

这是我的失败信息:

Failures:

  1) User validations #downcase_email downcases an email before saving
     Failure/Error: expect(user.save).to be_true
       expected false to respond to `true?`
     # ./spec/models/user_spec.rb:52:in `block (4 levels) in <top(required)>'

测试:

require 'rails_helper'
describe User do
  let(:valid_attributes) {
    {
      user_name: "username",
      email: "user@email.com",
      password: "password",
      password_confirmation: "password"
    }
  }
  describe "#downcase_email" do
    it "downcases an email before saving" do
      user = User.new(valid_attributes)
      user.email = "USER@EMAIL.COM"
      expect(user.save).to be_true
      expect(user.email).to eq("user@email.com")
    end
  end
end

我的用户模型:

class User < ActiveRecord::Base
  has_secure_password

  validates :user_name, presence: true,
                        uniqueness: true

  validates :email, presence: true,
                    uniqueness: true,
                    format: {
                      with: /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9\.-]+\.[A-Za-z]+\Z/
                    } 

  before_save :downcase_email                    

  def downcase_email
    self.email = email.downcase
  end                    
end

感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:2)

尝试使用be trueeq true。但这只是问题的一部分,因为您似乎有验证错误。要调查user.errors

中的此检查错误

答案 1 :(得分:1)

be_true更改为eq true。按照您的方式,它在#true上调用TrueObject方法。

答案 2 :(得分:-1)

即使传递了一个独特的电子邮件测试,但是需要一个唯一的用户名才能阻止保存。使用username#{n}的Factory Girl让我的测试通过。