创建/构建挂钩后DRY FactoryGirl

win*_*ons 6 ruby ruby-on-rails-3 factory-bot

我想在我的工厂中干掉后创建/构建钩子:

FactoryGirl.define do

  factory :poll do

    sequence :title do |n|
      "MyPollTitle#{n}"
    end
    sequence :description do |n|
      "MyPollDescription#{n}"
    end
    user

    factory :poll_with_answers do

      ignore do
        answers_count 2
      end

      after(:build) do |poll, evaluator|
        evaluator.answers_count.times do
          poll.answers << build(:answer, poll: poll)
        end
      end

      after(:create) do |poll, evaluator|
        evaluator.answers_count.times do
          poll.answers << create(:answer, poll: poll)
        end
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我面临的问题是,我似乎无法在FG中定义方法?想法如何干这个?

Adr*_*eil 7

首先,after(:create)隐式调用after(:build),至少在最新版本的FactoryGirl中:

after(:build) - 在构建工厂后调用(通过FactoryGirl.build,FactoryGirl.create)

https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#callbacks

因此,在您的情况下,以下代码应该足够:

after(:build) do |poll, evaluator|
  evaluator.answers_count.times do
    poll.answers << build(:answer, poll: poll)
  end
end
Run Code Online (Sandbox Code Playgroud)

但是,after(:build)当您使用build_stubbed()而不是触发时build(),这是我在遇到此线程时尝试做的事情.为了干掉这个代码,事实证明你可以使用该callback()方法为多个方法调用相同的块:

factory :user do
  callback(:after_build, :after_stub) do |user|
    do_something_with(user)
  end
end
Run Code Online (Sandbox Code Playgroud)