rspec expect(user.save).to be_true 测试失败

rspec test failing on expect(user.save).to be_true

使用 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

感谢您提供的任何帮助。

be_true 更改为 eq true。按照你的方式,它是在 TrueObject.

上调用 #true 方法

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

中的此检查错误

似乎即使唯一的电子邮件测试通过了,要求唯一的用户名也阻止了保存。使用 Factory Girl 和 username#{n} 让我的测试通过了。