0

これはこの質問の続きです: Factory_Girl が一意のレコードを生成していません

要件レコードが作成されない理由は、ユーザー レコード (または少なくとも関連付け) が適切に作成されていないためです。

次の工場があるとします。

factory :user do
  sequence(:name) { |n| "foo#{n}" }
  password "fooBar_1"
  email { "#{name}@example.com" }
  app_setting
  factory :adminUser do |user|
    user.role_assignments { |ra| [ra.association(:adminAssignment)] }
  end
  factory :reader do |user|
    user.role_assignments { |ra| [ra.association(:readerAssignment)] }
  end
end

factory :role_assignment do
  factory :adminAssignment do |ra|
    ra.association :role, factory: :adminRole
  end
  factory :readerAssignment do
    association :role
  end
end

factory :role do
  roleName "reader"
  factory :adminRole do |r|
    r.roleName "Administrator"
  end
end

次のコード スニペットは、"Administrator" の roleName を持つ関連するロール レコードを持つ、関連する role_assignment レコードを持つユーザーを生成する必要があります。

user = FactoryGirl.create(:adminUser)

これは実際には Rails コンソールで機能します。レコードは期待どおりにデータベースに作成されます。ただし、セットアップ中にコード行が実行されると、レコードは保存されず、役割の割り当てに依存するテストは失敗します。

レコードがコミットされていない理由を突き止めるためにどこを探すべきかについての提案はありますか?

4

1 に答える 1

1

Rails コンソールでは、ファクトリがうまく機能していないことがわかりました。すべての適切なテーブルにレコードが作成されていましたが、role_assignment レコードのユーザー ID は nil でした。どうやら、関連する多くの処理に使用していた形式が正しくありませんでした。

正しい形式はhttps://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.mdからのもので、次のとおりです(私の状況では):

factory :user do
sequence(:name) { |n| "foo#{n}" }
    password "fooBar_1"
    email { "#{name}@example.com" }
    app_setting
 factory :adminUser do
   after(:create) do |user, evaluator|
     FactoryGirl.create_list(:adminAssignment, 1, user: user)
   end
 end

ユーザー ファクトリの他の部分はまだクリーンアップする必要があるため、ここには含めません。これにより、ユーザーが作成され、適切にリンクされるロールと role_assignment が作成されます。

私のもう 1 つの問題は、実際にはアプリケーションの大規模な改造を行っており、ファクトリを作成する前に要件モデルのスコープ定義を見直していなかったため、作成していたレコードがスコープ内にないことが原因でした。おっとっと。

于 2013-07-13T06:02:47.910 に答える