0

関連するオブジェクトが正しいデータを共有してそれらを一致させるように、Factory Girl を使用して工場との関連付けを作成しようとしています。

オブジェクト A がオブジェクト C の 1 つのインスタンスに関連付けられており、オブジェクト B がオブジェクト C の別のインスタンスに関連付けられているシナリオに遭遇していますが、それらを両方ともオブジェクト C の同じインスタンスに関連付けたいと考えています。

Factory Girl - https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md 最新バージョンを使用

私のプロジェクトでやろうとしていることの簡単な例を次に示します。

FactoryGirl.define do
        factory :neutral_position, class: FinancialAccounting::Update::Neutral::Position do
          created_at    { Time.now }
          updated_at    { Time.now }

          factory :valid_neutral_position do
            association :security, factory: :security

            factory :valid_neutral_position_with_production_record do
              association :position, factory: :position

              # This modifies the created production account record so the attributes match.
              FactoryGirl.modify do
                factory :position, class: FinancialAccounting::Position do
                  association :security, factory: :security
                end
              end
            end
          end

        end
      end

:valid_neutral_position ファクトリで生成された同じセキュリティを指すように、関連する位置を変更しようとしていることに注意してください。このコードは現在、2 つの別個の証券を作成するため、ニュートラル ポジションは 1 つの証券に関連付けられ、ポジション ファクトリは別の証券に関連付けられます。

どうすればこれを達成できますか?この問題はアプリケーション全体で見られるため、これを理解することで、アプリケーションのテスト スイートが劇的に改善され、コードを DRY に保つことができます。

4

2 に答える 2

1

工場での定義ではなく、テスト/仕様でこれを整理する方が実際には簡単です。

最初にセキュリティを作成し、それを変数に割り当てます。

次に、そのセキュリティに依存するオブジェクトを作成するときに、変数をファクトリ コンストラクタに渡します。

あなたの例は少し複雑ですが、次のようになります。

specific_security = FactoryGirl.create(:security)
valid_natural_position = FactoryGirl.create(:valid_natural_position, security: specific_security)
position = FactoryGirl.create(:position, security: specific_security)

このようにして、オブジェクトの関係がテストで必要な方法で設定されていることを確認できます。2 つのセカンダリ ファクトリがセキュリティ オブジェクトを自動作成しなくなるため、作成されるオブジェクトの数が減るという追加の利点があります。

于 2012-08-14T13:41:10.107 に答える
1

私は実際には別の方法で行きました。それは工場に封じ込められ、よりクリーンなテストにつながります。ただし、必ずしも必要ではない場合でも、より多くのオブジェクトを生成しなければならないという欠点があります。

FactoryGirl.define do
  factory :neutral_position, class: FinancialAccounting::Update::Neutral::Position do
    created_at    { Time.now }
    updated_at    { Time.now }

    factory :valid_neutral_position do
      has_production_position
    end

    trait :has_production_position do
      association :position, factory: :position
      security { position.security }
    end

  end
end
于 2012-08-15T01:16:18.550 に答える