WedX - журнал о программировании и компьютерных науках

Factory Girl - Как создать фабрику для модели, вызывающей ассоциации?

Я пытаюсь создать фабрику для своей пользовательской модели вместе с ее ассоциациями. Однако я не могу правильно понять синтаксис в своем коде Factory Girl. Я прочитал документацию Factory Girl, но не могу найти никакой помощи в моем конкретном случае использования. Ошибки, которые я сейчас получаю при запуске своего набора тестов:

undefined method `subscription_args' for #<FactoryGirl::SyntaxRunner...

а также

Trait not registered: valid_card_data

Вот мои модели и ассоциации:

User.rb

has_one :subscription
has_one :plan, :through => :subscription
has_many :projects

Project.rb

belongs_to :user

Plan.rb

has_many :subscriptions

Подписка.rb

belongs_to :plan
belongs_to :user

а также

А вот мой код Factory Girl:

FactoryGirl.define do

  factory :user do
    first_name "Joel"
    last_name "Brewer"
    email { "#{first_name}.#{last_name}@example.com".downcase }
    password "foobar"
    password_confirmation "foobar"
    user_type "entrepreneur"

    subscription { build(:subscription, subscription_args) }

    after(:create) do |user|
      user.subscription.save!
    end
  end

  factory :subscription do
    user
    plan_id '4'

    ## I am trying to access a helper method from support/utilities ##
    ## This call to valid_card_data doesn't seem to be working...   ##

    stripe_card_token valid_card_data 
    email "[email protected]"
  end

  factory :project do
    title "Sample Project"
    user
  end
end


Ответы:


1

Вот как я делал это в прошлом. Конечно, не единственный способ:

(Обратите внимание, что я использую огурец.)

require 'factory_girl'

FactoryGirl.define do

  factory :user do |f|
    f.username 'superman'
  end

  factory :message do |f|
    f.association :user
    f.content 'Test message content'
  end

end

Это устанавливает, что фабрика сообщений должна связать сообщение с пользователем. Какой пользователь? Я устанавливаю, что в момент использования:

шаги.rb:

Given(/^there is a user$/) do
  @user = FactoryGirl.create(:user)
end

Given(/^the user has posted the message "(.*?)"$/) do |message_text|
  FactoryGirl.create(:message, :content => message_text, :user => @user)
end

When(/^I visit the page for the user$/) do
  visit user_path(@user)
end

Then(/^I should see "(.*?)"$/) do |text|
  page.should have_content(text)
end

Мой подход, указание в момент использования, имеет смысл для этого варианта использования. например Дан пользователь (сначала должен быть установлен пользователь), и этот пользователь разместил сообщение (теперь можно установить связь между существующим пользователем и сообщением)...

Это может сработать или не сработать для вас, но я сделал это именно так. Это может помочь или не помочь вам, но мы надеемся.

09.01.2014
  • Кент, ты прекрасен. Я ломал себе голову, пытаясь понять это последние два дня. Большая признательность! 10.01.2014

  • 2

    Есть несколько способов сделать это. Вот один пример:

    after(:build) do |keyword, evaluator|
      keyword.text = FactoryGirl.build(:keyword_text, :value => evaluator.keyword_text)
    end
    

    Вам не нужны subscription_args — их можно установить при вызове на завод.

    Где вы определяете свою черту?

    На моих фабриках они выглядят так:

    trait :with_category_associations do
      ..
    

    Для более сложных отношений вы, вероятно, захотите использовать:

      after(:create) do |keyword, evaluator|
        evaluator.categories.each do |category|
          FactoryGirl.create(:join_inventory_keyword, final: keyword, category: category)
        end
      end
    
    09.01.2014
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]