Как мне протестировать проверки моей пользовательской модели devise с использованием RSpec?

#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) . Спасибо за помощь!