3

User_spec.rb に次のコード ブロックがあります。

 @user = { username:'newuser',
           email:'new@user.com',
           fname:'new',
           lname:'user',
           password:'userpw',
           password_confirmation:'userpw'}

これらの属性を使用して を作成します。ただし、これらの属性をすべて Factory.rb に移動しました。

require 'factory_girl'

Factory.define :user do |u|
  u.username 'newuser'
  u.email 'new@user.com'
  u.fname 'new'
  u.lname 'user' 
  u.password 'newuserpw'
  u.password_confirmation 'newuserpw'
end

user_spec.rb の行を次のように置き換えます。

@user = Factory(:user)

ユーザーモデルに関連するすべてのテスト(電子メール、パスワード、ユーザー名などのテストなど)が失敗し、すべてが私に与えていました

「未定義のメソッド `stringify_keys' for…」

新しいユーザー オブジェクト

4

3 に答える 3

4

同様の問題が発生しました。これは、FactoryGirlオブジェクトをActiveRecordのcreate / newメソッドに渡していたためです(おっと!)。ここでも同じことをしているようです。

リストした最初の/トップの@userは値のハッシュですが、2番目の/ボトムの@userはユーザーオブジェクトのインスタンスです(FactoryGirlによってオンザフライで構築されます)。

スペックでこのようなものを呼び出している場合:

user = User.new(@user)

@userの最初の(ハッシュされた)バージョンは機能しますが、2番目の(オブジェクト化された)バージョンは機能しません(そして「stringify_keys」エラーをスローします)。@userの2番目のバージョンを適切に使用するには、仕様にこれを含める必要があります。

user = Factory(:user)

お役に立てば幸いです。

于 2011-11-21T16:22:06.333 に答える
2

診断するには、失敗したテストの例を確認する必要がありますが、属性が必要なときにオブジェクトを送信するという 1 つの原因が考えられます。失敗したテストの 1 つを次のように変更して修正したことがあります。

post :create, organization: @organization

post :create, organization: @organization.attributes
于 2012-02-06T02:59:23.517 に答える
0

@rowanuはあなたの質問に答えましたが、将来の参考のために私の例もレイアウトさせてください:

私の場合に失敗したのは次のとおりです。

@user = User.new user_attr
@user.bookings_build(Booking.new booking_attr)

属性のハッシュではなく、予約インスタンスで構築しようとしていることに注意してください

実際の例:

user_attr_hash    = FactoryGirl.attributes_for(:user)
booking_attr_hash = FactoryGirl.attributes_for(:booking)

@user = User.new user_attr_hash
@user.bookings.build(booking_attr_hash)

そして、spec/factories/domain_factory.rbには私が持っています

FactoryGirl.define do
  factory :user do
    # DEFAULT USER...
    password "123123123"
    email "factory_girl@aaa.aaa"
    # there rest of attributes set...
  end

  factory :booking do
    start_date Date.today
    end_date Date.today+3
    # the rest of attributes
  end
end
于 2014-05-30T09:31:25.517 に答える