Тестирование пользовательской модели с Rspec, Devise и Factory Girl - PullRequest
20 голосов
/ 17 мая 2011

Я думаю, что проблема в том, что моя фабрика пользователей строится.Я получаю сообщение об ошибке, в котором говорится, что пароль не может быть пустым, но он явно установлен в моем factory.rb.Кто-нибудь видит что-то, что я могу пропустить?Или причина того, почему спецификация не работает?Я делаю очень похожую вещь для одной из моих других моделей, и это кажется успешным.Я не уверен, вызвана ли ошибка устройством или нет.

Ошибка Rspec

User should create a new instance of a user given valid attributes
Failure/Error: User.create!(@user.attributes)
ActiveRecord::RecordInvalid:
  Validation failed: Password can't be blank
# ./spec/models/user_spec.rb:28:in `block (2 levels) in <top (required)>'

Factories.rb

Factory.define :user do |user|
  user.name                   "Test User"
  user.email                  "user@example.com"
  user.password               "password"
  user.password_confirmation  "password"
end

user_spec.rb

require 'spec_helper'

describe User do
  before(:each) do
    @user = Factory.build(:user)
  end

  it "should create a new instance of a user given valid attributes" do
    User.create!(@user.attributes)
  end
end

user.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
end

Ответы [ 3 ]

30 голосов
/ 17 мая 2011

В Factory Girl это создает атрибуты:

@user_attr = Factory.attributes_for(:user)

И это создает новый экземпляр:

@user = Factory(:user)

Поэтому измените вышеприведенное и попробуйте:

User.create!(@user_attr)

В глубине, что вы пытаетесь сделать, терпит неудачу, потому что:

  • вы создали новый несохраненный экземпляр

  • пароль является виртуальныматрибут

  • атрибуты экземпляра не содержат виртуальные атрибуты (я полагаю)

7 голосов
/ 25 апреля 2013

Самый простой подход ИМО:

FactoryGirl.modify do
  factory :user do
    after(:build) { |u| u.password_confirmation = u.password = ... }
  end
end
5 голосов
/ 04 февраля 2013

Один совет, который сделал работу для меня. Я использовал FactoryGirl.create(:user), который не работал. Изменил это на это:

user = FactoryGirl.build(:user)
user.password = "123456"
user.save
post :login, {:email => user.email, :password => "123456"}
# do other stuff with logged in user

Возможно, это потому, что «пароль» - это виртуальное поле. Надеюсь, это кому-нибудь намекает.

...