Каков синтаксис для создания фабрики с ассоциацией, использующей трейт?

Я действительно пытаюсь понять, как создавать сложные фабрики с Factory Girl, и это НЕ просто.

У меня есть следующее:

  • Подписка принадлежит пользователю

  • Подписка принадлежит_плану

Я хочу протестировать разные Plans. Вот как я это настроил:

FactoryGirl.define do
  factory :plan do
    trait :copper do
      name          { "Copper" }
      amount        { 5 }
      stripe_id     { "Economy" }
      listing_limit { 10 }
      repositories_allowed { 1 }
    end
    trait :copper_multi do
      name          { "Copper Multi" }
      amount        { 10 }
      stripe_id     { "Copper_Multi" }
      listing_limit { 10 }
      repositories_allowed { 5 }
    end
    trait :bronze do
      name          { "Bronze" }
      amount        { 5 }
      stripe_id     { "Basic" }
      listing_limit { 10 }
      repositories_allowed { 1 }
    end
    trait :bronze_multi do
      name          { "Bronze Multi" }
      amount        { 10 }
      stripe_id     { "Basic_Multi" }
      listing_limit { 10 }
      repositories_allowed { 5 }
    end
  end
end

Subscription завод это:

FactoryGirl.define do
  factory :subscription do
    association :user
    association :plan
    start_date { Time.now }
    end_date { 365.days.from_now }
  end

end

Естественно, это не удается, потому что фабрику Plan нельзя использовать без указания трейта. Это по дизайну.

Кроме того, в чем разница между:

  factory :subscription do
    association :user
  end

а также:

  factory :subscription do
    user
  end

person AKWF    schedule 09.01.2014    source источник


Ответы (1)


Укажите план по умолчанию

FactoryGirl.define do
  factory :plan do
    name          { "Default" }
    amount        { 1 }
    stripe_id     { "Default" }
    listing_limit { 10 }
    repositories_allowed { 1 }

    trait :copper do
      name          { "Copper" }
      amount        { 5 }
      stripe_id     { "Economy" }
      listing_limit { 10 }
      repositories_allowed { 1 }
    end
  end
end

Теперь это должно работать

FactoryGirl.define do
  factory :subscription do
    association :user
    association :plan
    start_date { Time.now }
    end_date { 365.days.from_now }
  end
end

Если вы хотите создать подписку с определенным свойством (медь) для плана

FactoryGirl.define do
  factory :subscription do
    association :user
    association :plan, :factory => [:plan, :copper]
    start_date { Time.now }
    end_date { 365.days.from_now }
  end
end

Нет никакой разницы между

factory :subscription do
    association :user
  end

а также

factory :subscription do
  user
end

Но вы можете использовать последнее, только если имя ассоциации и имя фабрики совпадают.

person usha    schedule 09.01.2014