web-dev-qa-db-ja.com

Rspec、Devise、FactoryGirlを使用したユーザーモデルのテスト

ユーザーファクトリの構築に問題があると思います。パスワードを空白にすることはできないというエラーが表示されますが、factory.rbで明確に設定されています。誰かが私が見逃しているかもしれない何かを見ますか?または、仕様が失敗する理由は何ですか?私は他のモデルの1つに対して非常によく似たことをしますが、成功しているようです。エラーの原因がデバイスかどうかはわかりません。

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)>'

Factorys.rb

Factory.define :user do |user|
  user.name                   "Test User"
  user.email                  "[email protected]"
  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
20
ardavis

Factory Girlでは、これにより属性が作成されます。

@user_attr = Factory.attributes_for(:user)

そして、これは新しいインスタンスを作成します:

@user = Factory(:user)

したがって、上記を変更して試してください。

User.create!(@user_attr)

徹底的に、あなたがやろうとしていることは次の理由で失敗します:

  • 保存されていない新しいインスタンスを作成していました

  • パスワードは仮想属性です

  • インスタンスの属性に仮想属性が含まれていない(おそらく)

30
apneadiving

最も簡単なアプローチIMO:

FactoryGirl.modify do
  factory :user do
    after(:build) { |u| u.password_confirmation = u.password = ... }
  end
end
7
Isaac Betesh

私のために仕事をした1つのヒント。機能しない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

これはおそらく、「パスワード」が仮想フィールドであるためです。これが誰かをほのめかすことができることを願っています。

5
kode