0

私は工場と特性を持っています。ファクトリで属性を設定し、後で特性を使用してこの属性を変更したいと思います:

factory :photo_gallery do
  photos { PhotosGenerator.generate_10_photos }

  after(:build) do |photo_gallery|
    # set value of some other attribute based on value of photos attribute
  end
end

trait :non_broken do
  photos { photos.reject(&:broken?) } # raises `stack level too deep (SystemStackError)`
end

ご覧のとおり、 が上がりSystemStackErrorます。photosファクトリでこの属性に設定された値に基づいて、特性の属性の値を設定するにはどうすればよいですか?

4

3 に答える 3

0

追加の無視された属性を factory に追加し、それを使用してトレイトの写真にアクセスします。

factory :photo_gallery do
  ignore do
    temp_photos { PhotosGenerator.generate_10_photos }
  end

  photos { temp_photos }
end

trait :non_broken do
  photos { temp_photos.reject(&:broken?) } # OK
end
于 2013-07-02T12:22:17.497 に答える
0

この行は再帰的です:

photos { photos.reject(&:broken?) }

特性は継承とは異なります。「スーパー」実装を呼び出すことはできません。代わりに、最後に適用された特性が使用される唯一の実装になります。

photos次のように、以前の実装を参照せずに、属性を完全に再定義する必要があります。

photos { PhotosGenerator.generate_10_photos(broken: false) }

または、コールバックを使用して、属性を再定義せず、設定後に変更することもできます。

trait :non_broken do
  after :build do |object|
    object.photos.reject!(&:broken?)
  end
end
于 2013-07-02T11:49:54.093 に答える