1

User モデルと Task モデル (Rails 4) で rolify を使用しています。ユーザーが持つことができる役割の 1 つに「所有者」があります。Factory Girl を使用してユーザー オブジェクトを作成し、ロールを割り当てたいと考えています。ここに私の工場があります:

FactoryGirl.define do

  factory :task do  
    owner "Steve"
    agency "an agency"
    facility "a facility"
    description "This task must absolutely be done"
    due_date "2013-12-22 03:57:37"
    completed_date "2013-12-22 03:57:37"

    factory :task_with_owner do
      ignore do
        user_id nil
      end

      after(:create) do |task, user_id|
        User.find(user_id).add_role :owner, task
      end
    end 
  end
end

この仕様は合格します:

  it 'is capable of creating a valid object with owner' do
    @user = create(:user)
    task = create(:task_with_owner, user_id: @user.id)
    expect(@user.has_role? :owner, task).to be_true
  end

この仕様は失敗します:

  it 'is capable of creating two valid objects with an owner' do
    @user = create(:user, username: 'janeblow')
    task = create(:task_with_owner, user_id: @user.id)
    expect(@user.has_role? :owner, task).to be_true
    task = create(:task_with_owner, user_id: @user.id)
    expect(@user.has_role? :owner, task).to be_true
  end

エラーは次のとおりです。

Failure/Error: task = create(:task_with_owner, user_id: @user.id)                                   
ActiveRecord::RecordNotFound:                                                                       
  Couldn't find User with id=#<#<Class:0x000000050f5e10>:0x00000004c9ed08>                          
 # ./spec/factories/tasks.rb:19:in `block (4 levels) in <top (required)>'                            
 # ./spec/models/role_spec.rb:15:in `block (2 levels) in <top (required)>'

なんで?

4

1 に答える 1

1

after(:create) ブロックが少し間違っているように見えます。次のように変更してみてください。

after(:create) do |task, vars|
  User.find(vars.user_id).add_role :owner, task
end

次に、失敗した仕様を再実行します。

user_id渡されたものを無視してnil代わりに使用するようにファクトリに指示したため、after(:create)ブロックでは、渡された属性 (2 番目のブロック引数、この場合は vars) からアクセスする必要があります。あなたはほとんどそこにいましたが、そのオブジェクト内から属性自体ではなく、属性を保持するために factory_girl が使用するオブジェクトを渡していました。

別の例については、こちらのセクションを参照してくださいTransient Attributes- https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md

于 2014-01-04T04:01:46.917 に答える