2015-03-18 2 views
0

Я продолжаю получать эти две ошибки во время главы 10 руководства RoR от Hartl и, похоже, не может найти решение для них. Некоторое время я исправлял проблемы, но ответ продолжает меня уклоняться. Что-то не так с USER.rb?Тесты Hartl Rspec Failed

FAIL["test_name_should_not_be_too_long", UserTest, 0.436818] 
test_name_should_not_be_too_long#UserTest (0.44s) 
     Expected true to be nil or false 
     test/models/user_test.rb:25:in `block in <class:UserTest>' 

FAIL["test_name_should_be_present", UserTest, 0.441668] 
test_name_should_be_present#UserTest (0.44s) 
     Expected true to be nil or false 
     test/models/user_test.rb:15:in `block in <class:UserTest>' 

Вот мой User_test

require 'test_helper' 

class UserTest < ActiveSupport::TestCase 

    def setup 
    @user = User.new(name: "Example User", email: "[email protected]", password: "foobar", password_confirmation: "foobar") 
    end 

    test "should be valid" do 
    assert @user.valid? 
    end 

    test "name should be present" do 
    @user.name = "" 
    assert_not @user.valid? 
    end 

test "email should be present" do 
    @user.email = "  " 
    assert_not @user.valid? 
    end 

test "name should not be too long" do 
    @user.name = "a" * 51 
    assert_not @user.valid? 
    end 

test "email should not be too long" do 
    @user.email = "a" * 244 + "@example.com" 
    assert_not @user.valid? 
    end 

test "email validation should accept valid addresses" do 
    valid_addresses = %w[[email protected] [email protected] [email protected] 
         [email protected] [email protected]] 
    valid_addresses.each do |valid_address| 
     @user.email = valid_address 
     assert @user.valid?, "#{valid_address.inspect} should be valid" 
    end 
    end 

test "email validation should reject invalid addresses" do 
    invalid_addresses = %w[[email protected],com user_at_foo.org [email protected] 
          [email protected]_baz.com [email protected]+baz.com] 
    invalid_addresses.each do |invalid_address| 
     @user.email = invalid_address 
     assert_not @user.valid?, "#{invalid_address.inspect} should be invalid" 
    end 
    end 

    test "email addresses should be unique" do 
    duplicate_user = @user.dup 
    duplicate_user.email = @user.email.upcase 
    @user.save 
    assert_not duplicate_user.valid? 
    end 

    test "email addresses should be saved as lower-case" do 
    mixed_case_email = "[email protected]" 
    @user.email = mixed_case_email 
    @user.save 
    assert_equal mixed_case_email.downcase, @user.reload.email 
    end 


    test "password should have a minimum length" do 
    @user.password = @user.password_confirmation = "a" * 5 
    assert_not @user.valid? 
    end 

    test "authenticated? should return false for a user with nil digest" do 
    assert_not @user.authenticated?(:remember, '') 
    end 

end 

User.rb

class User < ActiveRecord::Base 
    attr_accessor :remember_token, :activation_token 
    before_save :downcase_email 
    before_create :create_activation_digest 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i 
    validates :email, presence: true, length: { maximum: 255 }, 
        format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } 
    has_secure_password 
    validates :password, length: { minimum: 6 }, allow_blank: true 

    # Returns the hash digest of the given string. 
    def User.digest(string) 
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 
                BCrypt::Engine.cost 
    BCrypt::Password.create(string, cost: cost) 
    end 

    # Returns a random token. 
    def User.new_token 
    SecureRandom.urlsafe_base64 
    end 

    # Remembers a user in the database for use in persistent sessions. 
    def remember 
    self.remember_token = User.new_token 
    update_attribute(:remember_digest, User.digest(remember_token)) 
    end 

    # Returns true if the given token matches the digest. 
    def authenticated?(attribute, token) 
    digest = send("#{attribute}_digest") 
    return false if digest.nil? 
    BCrypt::Password.new(digest).is_password?(token) 
    end 

    # Forgets a user. 
    def forget 
    update_attribute(:remember_digest, nil) 
    end 

    # Returns the hash digest of the given string. 
    def self.digest(string) 
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 
                BCrypt::Engine.cost 
    BCrypt::Password.create(string, cost: cost) 
    end 

    # Returns a random token. 
    def self.new_token 
    SecureRandom.urlsafe_base64 
    end 

    class << self 
    # Returns the hash digest of the given string. 
    def digest(string) 
     cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 
                BCrypt::Engine.cost 
     BCrypt::Password.create(string, cost: cost) 
    end 

    # Returns a random token. 
    def new_token 
     SecureRandom.urlsafe_base64 
    end 
    end 

    private 

    # Converts email to all lower-case. 
    def downcase_email 
     self.email = email.downcase 
    end 

    # Creates and assigns the activation token and digest. 
    def create_activation_digest 
     self.activation_token = User.new_token 
     self.activation_digest = User.digest(activation_token) 
    end 

end 

ответ

5

Это хороший учебник. Я вижу, вы упускаете валидации в вашем user.rb

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

Добавьте эту строку в спецификацию модели user.rb и обе ошибка должна быть решена.

Смежные вопросы