2012-04-09 16 views
0

rspecを使用してTDDでRailsアプリケーションを作成しています。私は削除することができないエラーを取得しています:ここでRailsとRspec - 保護された属性を一括割り当てできません

Failure/Error: invalid_user = User.new(@attr.merge("provider" => "")) 
ActiveModel::MassAssignmentSecurity::Error: 
    Can't mass-assign protected attributes: uid, info 

は私のユーザーの仕様です:

user_spec.rb

require 'spec_helper' 

describe User do 
    before(:each) do 
    @attr = {"provider" => "providerexample", "uid" => "uidexample", "info" => {"name" =>  "Example"}} 
end 

it "should create a new instance given valid attributes" do 
    user = User.create_with_omniauth(@attr) 
end 

it "should require a provider" do 
    invalid_user = User.new(@attr.merge("provider" => "")) 
    invalid_user.should_not be_valid 
end 

it "should require a uid" do 
    invalid_user = User.new(@attr.merge("uid" => "")) 
    invalid_user.should_not be_valid 
end 
end 

そして、私のuser.rb

class User < ActiveRecord::Base 
    attr_accessible :name, :credits, :email, :provider 

    validates :name, :provider, :uid, :presence => true 

    def self.create_with_omniauth(auth) 
    create! do |user| 
    user.provider = auth["provider"] 
    user.uid  = auth["uid"] 
    user.name  = auth["info"]["name"] 
    end 
end 

エンド

uidinfoattr_accessibleに追加してmass-assignエラーをデバッグすると、次のエラーが表示されます。unknown attribute: info

+1

@attrではこれが何ですか? '' info "=> {" name "=>"例 "}' –

+0

あなたは正しいです、それはそこに行かないでください。物事は '' create_with_omniauth'に '' auth ["info"] 'を渡す必要があります。どうやってやるの? –

+0

どちらの場合でもうまくいくはずの回答を作成しました。 –

答えて

1

@attrとして持っていたものをinfoとマージすると、create_with_omniauth呼び出しでは存在しますが、通常のcreateメソッドでは存在しません。

describe User do 
    let(:user_attributes) { {"provider" => "providerexample", "uid" => "uidexample"} } 

    it "should create a new instance given valid attributes" do 
    expect { 
     User.create_with_omniauth(user_attributes.merge({"info" => {"name" => "example"})) 
    }.to not_raise_error 
    end 
end 
+0

ありがとう、私はあなたのコードに似た何かを得ることができた。 rspecに質問のコードのようにエラーを発生させる代わりに 'expect {...'を使うべきでしょうか? –

+0

クール...私はコード内にいくつかの形の肯定的なアサーションを持っています。私は 'user = User.create_with_omniauth; user.should be_persisted'はまだ良いです。 –

関連する問題