#ruby-on-rails #rspec #devise
#ruby-on-rails #rspec #разработка
Вопрос:
Я могу найти рекомендации по тестированию пользовательских контроллеров devise и представлений в RSpec. Я также видел предложения о том, что код devise gem уже протестирован, поэтому бесполезно тратить много времени на изобретение колеса.
Однако в моей пользовательской модели есть другие поля, которые мне нужно проверить при регистрации пользователя. Я использую стандартные validates...
инструкции в модели user.rb. Например:
validates_presence_of :nickname
Я пытаюсь использовать простое тестирование проверки в моем user_spec.rb, но когда я пытаюсь создать пользователя таким образом:
record = Factory.create(:user)
Я получаю эту ошибку:
undefined method `encode!' for "Confirmation":String
encode!
Метод не взят из моего кода, это должен быть один из драгоценных камней, которые использует devise, но я пока не смог его найти.
Я попытался создать пользователя с помощью User.new и Factory Girl. В любом случае я получаю одну и ту же ошибку. Эта спецификация проходила, пока я не обновил все свои драгоценные камни. К сожалению, я не записал все, что было обновлено в то время. Я пытался откатить devise к предыдущим версиям, но все еще получаю ту же ошибку.
Rails 3, RSpec2
Спасибо за любой совет.
Ответ №1:
Кажется, все в порядке, может быть, мой тестовый код поможет вам:
user_spec.rb
require 'spec_helper'
describe User do
before :each do
@user = Factory.build(:user)
end
it "should not be valid without a first_name" do
@user.first_name = nil
@user.should_not be_valid
end
end
user.rb (модель)
class User < ActiveRecord::Base
validates_presence_of :first_name
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable, :lockable and :timeoutable
devise :database_authenticatable, :registerable, :lockable,
:recoverable, :rememberable, :trackable
# Setup accessible (or protected) attributes for your model
attr_accessible :login, :first_name, :email, :password, :password_confirmation, :remember_me
attr_accessor :login
devise :database_authenticatable, :recoverable, :validatable
protected
def password_required?
!persisted? || password.present? || password_confirmation.present?
end
end
Комментарии:
1. Спасибо. Я думаю, это может быть то, что я включаю (или пропускаю) при создании пользователя. Как выглядит ваше заводское определение для:user? Мой:
Factory.define :user, :class => User do |f| f.id 327 f.email 'shadow@example.com' f.password 'shadow33' f.password_confirmation 'shadow33' f.nickname 'shadow' end
2. Ваш пример привел меня к виновнику … разница между
Factory.create(:user)
иFactory.build(:user)
. Спасибо за помощь!