2013-09-09 4 views
0

Я пытаюсь написать тест, который проверяет уникальность адреса электронной почты.Ошибка теста Ruby On Rails: недостаток пароля отсутствует в новой записи

Это для создания новой учетной записи пользователя в Rails 4.0.0 и использования has_secure_password.

Я получаю эту ошибку:

User should require case sensitive unique value for email 
    Failure/Error: it { should validate_uniqueness_of(:email) } 
    RuntimeError: 
     Password digest missing on new record 
    # ./spec/models/user_spec.rb:8:in `block (2 levels) in <top (required)>' 

user_spec.rb:

require "spec_helper" 

describe User do 
    it { should validate_presence_of(:email) } 
    it { should validate_presence_of(:full_name) } 
    it { should validate_presence_of(:password_digest) } 
    it { should validate_uniqueness_of(:email) } 
end 

А вот модель User:

class User < ActiveRecord::Base 
    has_secure_password 

    validates :email, presence: true, uniqueness: true 
    validates :full_name, presence: true 
    validates :password_digest, presence: true 
end 

Что означает сообщение об ошибке означает, и что я делать не так?

+1

Если вы заказываете другое электронное письмо, возникает ли ошибка? –

+0

Что я делаю, это запуск 'bundle exec rspec' без предоставления адреса электронной почты. Здесь, в [docs for shoulda] (http://rubydoc.info/github/thoughtbot/shoulda-matchers/master/Shoulda/Matchers/ActiveModel:validate_uniqueness_of), не похоже, что есть требование ввести адрес электронной почты , Я даже не уверен, где бы я ввел адрес электронной почты! – amorphid

+1

Как вы создаете объект 'User' в спецификации? Можете ли вы опубликовать свой код Factory/Fixtures для этого. –

ответ

1

Проблема решена. Я добавил строку для создания объекта User перед каждым тестом, и теперь ошибка исчезла.

describe User do   
    # this before section solved the problem 
    before(:each) do 
    User.create(
     full_name: "Bob", 
     email: "[email protected]", 
     password: "bob", 
     password_confirmation: "bob" 
    ) 
    end 

    it { should validate_presence_of(:email) } 
    it { should validate_presence_of(:full_name) } 
    it { should validate_presence_of(:password_digest) } 

    it { should validate_uniqueness_of(:email) } 
end 
+1

Согласитесь, что это решает проблему. Но нехорошо создавать пользователя для ВСЕХ ваших тестов! Только проверка на уникальность требует наличия записи в БД (или она пытается создать новую запись с опциями ': validate => false'). Вот почему вы получили ошибку. источник http://rubydoc.info/github/thoughtbot/shoulda-matchers/master/Shoulda/Matchers/ActiveModel#validate_uniqueness_of-instance_method – gotva

+0

Хорошая точка getva. Я обновил 'user_spec.rb' только для' User.create (...) 'on' должен validate_uniqueness_of (: email) '. Спасибо за совет. – amorphid

0

Ответ на ваш вопрос здесь: https://github.com/thoughtbot/shoulda-matchers/issues/371

Похоже, нынешнее решение создать новую запись перед тестированием уникальности. Короче говоря, вот основная проблема:

It appears that the Rails 4 version of has_secure_password adds a before_create to ensure that password_digest is filled in; however, the Rails 3 version does not have this check.